[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: GNUstep - check for reuse address
From: |
Riccardo Mottola |
Subject: |
Re: GNUstep - check for reuse address |
Date: |
Fri, 8 Jan 2016 14:08:43 +0100 |
User-agent: |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:42.0) Gecko/20100101 Firefox/42.0 SeaMonkey/2.39 |
Hi,
Svante Signell wrote:
Depends on how the test is made. SO_REUSEADDR is defined in bits/socket.h but is
not functional (yet).
I attach the test below. The test is clearly done on AF_INET, so from
what you tell, it is expected to work.
I know gnustep has a setting to work with local and with inet sockets.
Perhaps the code tries to treat them the same way? I will dig in the code.
Do local sockets work in HURD ? I always switch to inet since years, but
perhaps this is obsolete now.
Riccardo
/*
Copyright (C) 2005 Free Software Foundation
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.
*/
#if defined(__MINGW32__) || defined(__MINGW64__)
#include <windows.h>
#include <winsock2.h>
#else
#include <time.h>
#include <sys/time.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#endif /* __MINGW__ */
#include <sys/file.h>
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#ifndef INADDR_NONE
#define INADDR_NONE -1
#endif
// Maximum data in single I/O operation
#define NETBUF_SIZE 4096
main()
{
struct sockaddr_in sin;
int size = sizeof(sin);
int status = 1;
int port;
int net;
memset(&sin, '\0', sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = 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 (bind(net, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
fprintf(stderr, "unable to bind socket 1\n");
(void) close(net);
return 2;
}
listen(net, 5);
if (getsockname(net, (struct sockaddr*)&sin, &size) < 0)
{
fprintf(stderr, "unable to get socket 1 name\n");
(void) close(net);
return 2;
}
port = sin.sin_port;
memset(&sin, '\0', sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = port;
if ((net = socket(AF_INET, SOCK_STREAM, PF_UNSPEC)) < 0)
{
fprintf(stderr, "unable to create socket 2\n");
return 2;
}
setsockopt(net, SOL_SOCKET, SO_REUSEADDR, (char *)&status,
sizeof(status));
/*
* Now ... this bind should fail unless SO_REUSEADDR is broken.
*/
if (bind(net, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
return 0;
}
return 1;
}
- Re: GNUstep - check for reuse address, (continued)
- Re: GNUstep - check for reuse address, Svante Signell, 2016/01/08
- Re: GNUstep - check for reuse address, Svante Signell, 2016/01/08
- Re: GNUstep - check for reuse address, Samuel Thibault, 2016/01/08
- Re: GNUstep - check for reuse address, Pino Toscano, 2016/01/08
- Re: GNUstep - check for reuse address, Samuel Thibault, 2016/01/08
- Re: GNUstep - check for reuse address, Svante Signell, 2016/01/08
- Re: GNUstep - check for reuse address, Samuel Thibault, 2016/01/08
- Re: GNUstep - check for reuse address, Svante Signell, 2016/01/09
- Re: GNUstep - check for reuse address, Samuel Thibault, 2016/01/09
Re: GNUstep - check for reuse address, Samuel Thibault, 2016/01/08
Re: GNUstep - check for reuse address,
Riccardo Mottola <=
Re: GNUstep - check for reuse address, Samuel Thibault, 2016/01/08