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
Post a Comment