Hi Nilesh,
thank you very much for isolating the problem in the socket handling
and providing a small test program.
Let us have a look (it might take some time).
Best regards
Michael
On Jul 19, 2011, at 2:56 AM, Nilesh Vaghela wrote:
> Hi Michael and Robin,
>
> I verified the same problem WITHOUT using SSL library and the problem is the
> same so it seems like Windows ISSUE.
> Earlier Yogi and myself sent you guys sample program with SSL library.
>
> See program below which illustrates the problem.
>
> I think DTLS library relies heavily in connected socket and it seems like
> LINUX and WINDOWS behavior looks different.
>
> /* Tested on linux and windows
> * On windows use mingw-gcc:
> * gcc -Wall -g -o udplisten test.c -lws2_32
> * On Linux
> * gcc -Wall -g -o udplisten test.c
> * Test server
> * ./udplisten
> * Test client with in Linux:
> * echo hello | netcat -u machinename -p 5555 9898 (this goes to listen
> socket sockl)
> * echo hello | netcat -u machinename -p 5555 9898 (this goes to new
> connected socket 1)
> * echo hello | netcat -u machinename -p 5556 9898 (this goes to listen
> socket sockl)
> * echo hello | netcat -u machinename -p 5556 9898 (this goes to new
> connected socket 2)
> */
> #ifdef WIN32
> #include <winsock2.h>
> #include <ws2tcpip.h>
> #else
> #include <sys/select.h>
> #include <sys/socket.h>
> #include <netinet/in.h>
> #define SOCKET int
> #define INVALID_SOCKET -1
> #endif
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <errno.h>
>
> #undef max
> #define max(x,y) ((x) > (y) ? (x) : (y))
>
> #define MAX_CLIENTS 256
> fd_set read_set, temp_set;
> SOCKET client_fds[256];
>
>
> //SOCKET socka = INVALID_SOCKET, sockb = INVALID_SOCKET;
> SOCKET sockl;
> SOCKET max;
> int num_clients = 0;
> struct sockaddr_in addr;
>
> static void
> die(const char *str)
> {
> perror(str);
> exit(1);
> }
>
> static SOCKET
> mksocket(struct sockaddr_in *addr)
> {
> SOCKET sock = INVALID_SOCKET;
> int opt = 1;
> if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
> die("socket");
> if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&opt,
> sizeof(opt)) < 0)
> die("setsockopt");
> if (bind(sock, (struct sockaddr *)addr, sizeof(struct sockaddr_in)) < 0)
> die("bind");
> return sock;
> }
>
> static void
> process_listen(SOCKET sock, const char *label)
> {
> char buffer[8192];
> struct sockaddr_in caddr;
> int count;
> int ret;
> SOCKET conn_sock;
>
> socklen_t caddr_size = sizeof(caddr);
> memset(&caddr, 0, caddr_size);
> count = recvfrom(sock, buffer, sizeof(buffer), 0,
> (struct sockaddr *)&caddr, &caddr_size);
> if (count < 0) die(label);
> printf("%s %d\n", label, count);
>
> conn_sock = mksocket(&addr);
> max = max(conn_sock, max);
> FD_SET(conn_sock, &read_set);
>
> client_fds[num_clients++] = conn_sock;
>
> ret = connect(conn_sock, (const struct sockaddr *)&caddr, caddr_size);
> if (ret == 0)
> printf("connected to address = %s and port = %d\n",
> inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));
> else
> printf("connetc failed address = %s and port = %d\n",
> inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));
>
> }
>
>
> static void
> process(SOCKET sock, const char *label)
> {
> char buffer[8192];
> struct sockaddr_in caddr;
> int count;
> socklen_t caddr_size = sizeof(caddr);
> memset(&caddr, 0, caddr_size);
> count = recvfrom(sock, buffer, sizeof(buffer), 0,
> (struct sockaddr *)&caddr, &caddr_size);
> if (count < 0) die(label);
> printf("%s : bytes %d\n", label, count);
> }
>
> int
> main(int argc, char *argv[])
> {
> int i;
>
> #ifdef WIN32
> WSADATA wsaData;
> if (WSAStartup(MAKEWORD(2,2), &wsaData))
> return -1;
> #endif
> for (i = 0; i < MAX_CLIENTS; i++)
> client_fds[i] = INVALID_SOCKET;
>
> addr.sin_family = AF_INET;
> addr.sin_port = htons(9898);
> addr.sin_addr.s_addr = INADDR_ANY;
>
> sockl = mksocket(&addr);
>
> max = sockl;
> FD_ZERO(&read_set);
> FD_SET(sockl, &read_set);
>
> for (;;) {
> char buf[256];
>
>
>
> memcpy(&temp_set, &read_set, sizeof(fd_set));
> if (select(max+1, &temp_set, NULL, NULL, NULL) < 0)
> die("select");
>
> if (FD_ISSET(sockl, &temp_set))
> process_listen(sockl, "LISTEN");
>
> for (i = 0; i < num_clients; i++)
> {
> if (FD_ISSET(client_fds[i], &temp_set))
> {
> sprintf(buf, "%s %d", "RECEIVED FROM CLIENT ", i);
>
> process(client_fds[i], buf);
> }
>
> }
>
> }
> return 0;
> }
>
> --Nilesh.
>
>
> Stratacache Inc.(Santa Clara Office)
> Systems Architect
> O: 408-844-9810(2110)
> M: 408-202-5401
>
>
> ----- Original Message -----
> From: "Michael Tüxen" <[email protected]>
> To: [email protected]
> Cc: "Robin Seggelmann" <[email protected]>
> Sent: Monday, July 18, 2011 9:42:03 AM GMT -08:00 US/Canada Pacific
> Subject: Re: DTLSv1_listen unable to accept second client on windows (This
> works on Linux)
>
> On Jul 18, 2011, at 5:18 PM, Yogesh Chopra wrote:
>
> > Hi,
> > I am using a separate (second socket) for client connect and
> > leaving the listening socket unconnected to receive everything else.
> > (The server program is same as provided for linux earlier). The server
> > program is same as provided earlier. (This will need modifications for
> > windows and I will try uploading a new server program for windows
> > compilation but this program is essentially what is used).
> ... it would be very helpful to have a program which shows the issue
> you are experiencing, since it might be a bug in OpenSSL or in the
> application.
>
> Best regards
> Michael
> >
> > http://groups.google.com/group/mailing.openssl.dev/browse_thread/thread/91f7fa90ab401759?pli=1
> >
> >
> > Thanks,
> > -Yogi
> >
> > On Sun, Jul 17, 2011 at 11:57 PM, Robin Seggelmann
> > <[email protected]> wrote:
> >> Hi Yogesh,
> >> are you connecting the listening socket? That shouldn't work on Linux
> >> either. The DTLSv1_listen call returns the sock_addr structure of the
> >> connecting client, so you can create a new socket dedicated for that
> >> client and connect it, while leaving the listening socket unconnected to
> >> receive everything else.
> >>
> >> Best regards
> >> Robin
> >>
> >>
> >> On Jul 16, 2011, at 1:53 AM, Yogesh Chopra wrote:
> >>
> >>> Hi,
> >>> I am using OpenSSL-1.0.0d (release) + all cumulative bug fixes +
> >>> DTLS Heartbeat feature patch on Windows.
> >>>
> >>> A DTLS server (non-blocking) using DTLSv1_Listen having a UDP socket
> >>> with SO_REUSEADDR is unable to accept a second client connection when
> >>> it is already accepted a client connection and serving it.
> >>>
> >>> Details:
> >>>
> >>> Server Client 1
> >>> State
> >>>
> >>> DTLSv1_Listen Handshake complete
> >>> Established
> >>> Client 2
> >>> State
> >>> Keeps sending CLIENT
> >>> HELLO but Server never responds with HelloVerify request
> >>> and select never gets
> >>> triggered on the listen fd (used by DTLSv1_listen)
> >>>
> >>> As per some of the windows documents for connect, see excerpt below:
> >>>
> >>> http://msdn.microsoft.com/en-us/library/ms737625%28v=vs.85%29.aspx
> >>>
> >>> "For a connectionless socket (for example, type SOCK_DGRAM), the
> >>> operation performed by connect is merely to establish a default
> >>> destination address that can be used on subsequent send/ WSASend and
> >>> recv/ WSARecv calls. Any datagrams received from an address other than
> >>> the destination address specified will be discarded."
> >>>
> >>> So it appears that once a socket is connected to a client, it will no
> >>> longer be used for accepting second client.
> >>>
> >>> It has been observed, that when the first client connection is
> >>> released (terminated) a new client connection is accepted.
> >>>
> >>> This is not a problem on Linux.
> >>>
> >>> Is there any workarounds or special handling for windows ?
> >>>
> >>> Thanks,
> >>> -Yogi
> >>> ______________________________________________________________________
> >>> OpenSSL Project http://www.openssl.org
> >>> Development Mailing List [email protected]
> >>> Automated List Manager [email protected]
> >>
> >>
> >>
> > ______________________________________________________________________
> > OpenSSL Project http://www.openssl.org
> > Development Mailing List [email protected]
> > Automated List Manager [email protected]
> >
>
> ______________________________________________________________________
> OpenSSL Project http://www.openssl.org
> Development Mailing List [email protected]
> Automated List Manager [email protected]
______________________________________________________________________
OpenSSL Project http://www.openssl.org
Development Mailing List [email protected]
Automated List Manager [email protected]