mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-22 16:33:29 +00:00
socket fixes
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@39919 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
ecfbd24d8e
commit
01377d55ee
3 changed files with 21 additions and 20 deletions
|
@ -1,3 +1,9 @@
|
|||
2016-06-25 Richard Frith-Macdonald <rfm@gnu.org>
|
||||
|
||||
* Source/NSMessagePort.m:
|
||||
* config/config.reuseaddr.c:
|
||||
SO_REUSEADDR fixes.
|
||||
|
||||
2016-06-25 Richard Frith-Macdonald <rfm@gnu.org>
|
||||
|
||||
* Documentation/Base.gsdoc:
|
||||
|
|
|
@ -1503,9 +1503,6 @@ typedef struct {
|
|||
NSMapEnumerator me;
|
||||
int sock;
|
||||
void *dummy;
|
||||
#ifndef BROKEN_SO_REUSEADDR
|
||||
int opt = 1;
|
||||
#endif
|
||||
GSMessageHandle *handle = nil;
|
||||
|
||||
M_LOCK(myLock);
|
||||
|
@ -1533,20 +1530,6 @@ typedef struct {
|
|||
{
|
||||
NSLog(@"unable to create socket - %@", [NSError _last]);
|
||||
}
|
||||
#ifndef BROKEN_SO_REUSEADDR
|
||||
/*
|
||||
* Under decent systems, SO_REUSEADDR means that the port can be reused
|
||||
* immediately that this process exits. Under some it means
|
||||
* that multiple processes can serve the same port simultaneously.
|
||||
* We don't want that broken behavior!
|
||||
*/
|
||||
else if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&opt,
|
||||
sizeof(opt)) < 0)
|
||||
{
|
||||
(void)close(sock);
|
||||
NSLog(@"unable to set reuse on socket - %@", [NSError _last]);
|
||||
}
|
||||
#endif
|
||||
else if ((handle = [GSMessageHandle handleWithDescriptor: sock]) == nil)
|
||||
{
|
||||
(void)close(sock);
|
||||
|
|
|
@ -44,13 +44,19 @@ main()
|
|||
sin.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
sin.sin_port = 0;
|
||||
|
||||
if ((net = socket(AF_INET, SOCK_STREAM, PF_UNSPEC)) < 0)
|
||||
if ((net = socket(AF_INET, SOCK_STREAM, PF_UNSPEC)) < 0)
|
||||
{
|
||||
fprintf(stderr, "unable to create socket 1\n");
|
||||
return 2;
|
||||
}
|
||||
|
||||
setsockopt(net, SOL_SOCKET, SO_REUSEADDR, (char *)&status, sizeof(status));
|
||||
if (setsockopt(net, SOL_SOCKET, SO_REUSEADDR,
|
||||
(char *)&status, sizeof(status)) < 0)
|
||||
{
|
||||
fprintf(stderr, "unable to set socket 1 option\n");
|
||||
(void) close(net);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (bind(net, (struct sockaddr *)&sin, sizeof(sin)) < 0)
|
||||
{
|
||||
|
@ -80,7 +86,13 @@ main()
|
|||
return 2;
|
||||
}
|
||||
|
||||
setsockopt(net, SOL_SOCKET, SO_REUSEADDR, (char *)&status, sizeof(status));
|
||||
if (setsockopt(net, SOL_SOCKET, SO_REUSEADDR,
|
||||
(char *)&status, sizeof(status)) < 0)
|
||||
{
|
||||
fprintf(stderr, "unable to set socket 2 option\n");
|
||||
(void) close(net);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Now ... this bind should fail unless SO_REUSEADDR is broken.
|
||||
|
|
Loading…
Reference in a new issue