c++ - AcceptEx returns 1022 (WSAEINVAL)... What did I do wrong? -


i trying code small test-server completion ports. when try call acceptex... returns wsaeinval winsock error code... don´t mistake

http://codepad.org/nexg3ssh <- code on codepad

and

startwinsock();  cout << "winsock initiated\n";  //get number of processors  dword ulprocessors = getnumberofprocessors();  cout << "number of processors/threads, used: " << ulprocessors << endl;  //create completion port  hcompletionport = createiocompletionport(invalid_handle_value, null, 0, ulprocessors);  if(hcompletionport == null)   errorabort("could not create completion port");  cout << "completion port created\n";   //create threads  createthreads(ulprocessors);  cout << "threads created\n";   //create socket  acceptorsock = socket(af_inet, sock_stream, ipproto_tcp);  addrinfo *final, hints;  memset(&hints, 0, sizeof(hints));  hints.ai_family = af_inet;  hints.ai_flags = ai_passive;  if(getaddrinfo(null,"12345", &hints, &final))   errorabort("could not retrieve address information");  if(bind(acceptorsock,final->ai_addr, final->ai_addrlen))   errorabort("could not bind socket");  freeaddrinfo(final);  cout << "acceptor socket created , bound\nstarting listen on acceptor socket\n";  if(listen(acceptorsock, 2))   errorabort("can´t listen on socket");   //add acceptor socket file handle observed completion port  if(createiocompletionport((handle)acceptorsock, hcompletionport, new_connection, 0) != hcompletionport)   errorabort("a new completion port has been created instead of using existing one");  cout << "acceptor socket associated completion port\n";   resumethreads(2);  char lpoutputbuf[1024];  int outbuflen = 1024;  dword dwbytes;  overlapped over;  socket newsock = socket(af_inet, sock_stream, ipproto_tcp);    while(true)  {   memset(&over, 0, sizeof(over));   if(acceptex(acceptorsock, newsock, lpoutputbuf, outbuflen - ((sizeof(sockaddr_in) + 16) * 2), sizeof(sockaddr_in)+16, sizeof(sockaddr_in)+16, &dwbytes, &over) == false)   {    int x = wsagetlasterror();    if( x != wsa_io_pending)     errorabort("could not acceptex new connection");   }  } 

te problem in code this:

while(true) {   memset(&over, 0, sizeof(over));   if(acceptex(acceptorsock, newsock, lpoutputbuf, outbuflen - ((sizeof(sockaddr_in) + 16) * 2), sizeof(sockaddr_in)+16, sizeof(sockaddr_in)+16, &dwbytes, &over) == false)   {     int x = wsagetlasterror();     if( x != wsa_io_pending)     errorabort("could not acceptex new connection");   } } 

the second parameter of acceptex function (in case newsock) must unconnected , unbound socket, when new connection arrives newsock parameter invalid parameter (because connected), avoid new socket handle must created, loop must wait until new connection arrives, wsaevent must use. first function wsaeventselect must used associate fd_accept network event wsaevent, mus done before creation of acceptthread:

g_ev = wsacreateevent(); if (wsa_invalid_event == g_ev)   errorabort("error occurred while wsacreateevent()"; if (socket_error == wsaeventselect(acceptorsock, g_ev, fd_accept)) {   wsacloseevent(g_ev);   errorabort("error occurred while wsaeventselect()."); } 

the acceptthread call acceptex function , wait new connection, when new connection arrives newsock added completion port , new socket created, thread have elements required accept connections:

dword winapi acceptthread(lpvoid lparam) {   socket acceptorsock = (socket)lparam, new;   socket newsock;    overlapped over;       dword wr;    memset(&over, 0, sizeof(over));     {     newsock = socket(af_inet, sock_stream, ipproto_tcp);     if(acceptex(acceptorsock, newsock, lpoutputbuf, outbuflen - ((sizeof(sockaddr_in) + 16) * 2), sizeof(sockaddr_in)+16, sizeof(sockaddr_in)+16, &dwbytes, &over) == false)     {       int x = wsagetlasterror();       if (x != error_io_pending)       {         cout << "could not acceptex new connection" << endl;         return 1;       }       else       {         if (wsa_wait_timeout != (wr = wsawaitformultipleevents(1,  &g_ev, false, infinite, false)))         {           wsaenumnetworkevents(acceptorsock, g_ev, &wsaevents);           if ((wsaevents.lnetworkevents & fd_accept) &&  (0 == wsaevents.ierrorcode[fd_accept_bit]))           {             if (createiocompletionport(newsock, hcompletionport, 0, 0) == null)             {               cout << "error createiocompletionport" << endl;               return 2;             }             wsaresetevent(g_ev);           }         }       }     }   }while(wr != wsa_wait_event_0); } 

if body needs more information links useful: http://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancedscalableapp6b.html http://www.codeproject.com/kb/ip/simpleiocpapp.aspx http://msdn.microsoft.com/en-us/magazine/cc302334.aspx


Comments

Popular posts from this blog

Add email recipient to all new Trac tickets -

400 Bad Request on Apache/PHP AddHandler wrapper -

php - Change action and image src url's with jQuery -