sockets - WSAWaitForMultipleEvents returns timeout when send() is succesful -
i working on application involves socket programming. trying implement reset functionality in application in case server closed or crashed reason. reset need reestablish communication between client , server after manual restart of server. able send request client server server process , send reply client. send()
function @ server side returning success wsawaitformultipleevents()
function @ client side returning wsa_time_out
every time.
i restart socket @ client side so_reuseaddr
true value on reset. new network programming not able understand why happening.
please help. thank you
here code @ client side. little messed please bear me
void socketlistner::run() { // std::cout << "thread id of socketlistener : " << qthread::currentthreadid() << "\n"; if(_isframegrabber) { _listenforframes(); } else { _listenforrequests(); } } void socketlistner::_listenforrequests() { dword eventval; unsigned int eventsock; wsanetworkevents networkevents; std::stringstream ss; int bufferlength = 500; char * msg = new char[bufferlength]; std::string msg = ""; int retcode; int diff; while(!_done) { // giving 1 second less condition wait time // openthreads::scopedlock<openthreads::mutex> lock(_destructormutex); if((eventval=wsawaitformultipleevents(_eventcnt, _socketevents, false, 3000, false)) == wsa_wait_failed) { ss.str(""); ss << "wsawaitformultipleevents() failed error : " << wsagetlasterror(); log_error(ss.str()); emit socketerrorsignal(eventval); break; } else if(eventval == wsa_wait_timeout) { //openthreads::scopedlock<openthreads::mutex> lock(_mutex); if(_done) { wsacloseevent(_socketevents[0]); if(_eventcnt==2) wsacloseevent(_socketevents[1]); break; } continue; } if( (diff=(eventval - wsa_wait_event_0)) == 0 ) eventsock = s_sock; else if(diff == 1) eventsock = c_sock; else continue; if((wsaenumnetworkevents(eventsock, _socketevents[eventval - wsa_wait_event_0], &networkevents)) == socket_error) { ss.str(""); ss << "wsaenumnetworkevents() failed error : " << wsagetlasterror(); log_error(ss.str()); // break; } if (networkevents.lnetworkevents & fd_accept) { if (networkevents.ierrorcode[fd_accept_bit] != 0) { ss.str(""); ss << "fd_accept failed error : " << networkevents.ierrorcode[fd_accept_bit]; log_error(ss.str()); break; } if ((c_sock = accept(eventsock, null, null)) == invalid_socket) { ss.str(""); ss << "accept() failed error : " << wsagetlasterror(); log_error(ss.str()); break; } if ((_socketevents[_eventcnt] = wsacreateevent()) == wsa_invalid_event) { std::stringstream ss; ss << "wsacreateevent() failed error : " << wsagetlasterror(); log_error(ss.str()); break; } if( wsaeventselect(c_sock, _socketevents[_eventcnt], fd_read | fd_close) == socket_error) { ss.str(""); ss << "wsaeventselect() failed error : " << wsagetlasterror(); log_error(ss.str()); break; } ++_eventcnt; } if(networkevents.lnetworkevents & fd_read) { if (networkevents.lnetworkevents & fd_read && networkevents.ierrorcode[fd_read_bit] != 0) { ss.str(""); ss << "fd_read failed error : " << networkevents.ierrorcode[fd_read_bit]; log_error(ss.str()); } if((retcode = recv(eventsock, msg, bufferlength, 0)) > 0) { int place = 0; while(place < retcode) { if(msg[place] == '\n' && msg.length() != 0) { openthreads::scopedlock<openthreads::mutex> lock(_mutex); //naresh: replacing std::vector std::queue _requests.push(msg); msg = ""; } else { if(msg[place] != '\0') msg.push_back(msg[place]); } ++place; } } //abhishek: testing complete else block else if(retcode == 0 || wsagetlasterror() == wsaeconnreset) { //abhishek shutdown(c_sock, sd_both); shutdown(s_sock, sd_both); closesocket(c_sock); closesocket(s_sock); int error = wsagetlasterror(); if(!_initialize()) { _done = true; return; } } else if(retcode == socket_error) { bool stoplistening=false; int errorcode = wsagetlasterror(); _processsocketerror(errorcode, stoplistening); if(stoplistening) { log_warning("connection partner lost."); emit socketerrorsignal(errorcode); break; } } } if(networkevents.lnetworkevents & fd_close) { if (networkevents.ierrorcode[fd_close_bit] != 0) { ss.str(""); ss << "fd_close failed error : " << networkevents.ierrorcode[fd_close_bit]; log_error(ss.str()); emit socketerrorsignal(networkevents.ierrorcode[fd_close_bit]); } else if(!_stopped) { log_error("lost connection wall."); emit socketerrorsignal(networkevents.ierrorcode[fd_close_bit]); } closesocket(eventsock); break; } //sleep(100); } //while delete[] msg; msg = null; // if failure occurs make _bdone variable true, thread no longer running _cleanupcondition.signal(); }
here _initialize function
bool socketlistner::_initialize() { if(_ip.length() <= 0) { log_error("host ip address : " + _ip + " invalid."); return false; } //naresh: replacing vector queue while(!_requests.empty()) { _requests.pop(); } wsadata wsadata; if(wsastartup(0x101,&wsadata) != 0) { log_error("failed wsastartup() call."); return false; } sockaddr_in sockaddr; sockaddr.sin_family = af_inet; sockaddr.sin_port = htons(_port); sockaddr.sin_addr.s_addr = inet_addr(_ip.c_str()); s_sock = socket(af_inet,sock_stream,0); //abhishek:bugfix reset enable address reuse else bind() fail bool addrreuse = true; setsockopt(s_sock, sol_socket, so_reuseaddr, (const char*) &addrreuse, sizeof(bool)); if(!_isframegrabber) { if ((_socketevents[_eventcnt] = wsacreateevent()) == wsa_invalid_event) { std::stringstream ss; ss << "wsacreateevent() failed error : " << wsagetlasterror(); log_error(ss.str()); return false; } if(wsaeventselect(s_sock, _socketevents[_eventcnt], fd_accept | fd_close)== socket_error) { std::stringstream ss; ss << "wsaeventselect() failed error : " << wsagetlasterror(); log_error(ss.str()); return false; } ++_eventcnt; } if(s_sock == invalid_socket) return false; int errorcode = bind(s_sock,(sockaddr*)&sockaddr,sizeof(sockaddr)); if(errorcode == socket_error) { bool stoplistening = false; _processsocketerror(wsagetlasterror(), stoplistening); return false; } if(listen(s_sock,10)!=0) { return false; } return true; }
if peer dies there won't events @ all. reliable way detect broken connection in tcp write it. first write broken connection succeed later 1 fail.
Comments
Post a Comment