c - How network event FD_WRITE is generated when using Event Driven Sockets? -
i working on newtwork event based socket application.
when client has sent data , there read on socket, fd_read network event generated.
now according understanding, when server wants write on socket, there must event generated i.e. fd_write. how message generated?
when there available read, fd_read automatically generated fd_write when server wants write something?
anyone can me confusion please?
following code snippet:
wsaevent hevent = wsacreateevent(); wsanetworkevents events; wsaeventselect(newsocketidentifier, hevent, fd_read | fd_write); while(1) { //while(1) starts waitret = wsawaitformultipleevents(1, &hevent, false, wsa_infinite, false); //wsaresetevent(hevent); if(wsaenumnetworkevents(newsocketidentifier,hevent,&events) == socket_error) { //failure } else { //else event occurred starts if(events.lnetworkevents & fd_read) { //recvfrom() } if(events.lnetworkevents & fd_write) { //sendto() } } }
fd_write means can write socket right now. if send buffers fill (you're sending data faster can sent on network), won't able write anymore until wait bit.
once make write fails due buffers being full, message sent let know can retry send.
it's sent when first open socket let know it's there , can start writing.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms741576(v=vs.85).aspx
the fd_write network event handled differently. fd_write network event recorded when socket first connected call connect, connectex, wsaconnect, wsaconnectbylist, or wsaconnectbyname function or when socket accepted accept, acceptex, or wsaaccept function , after send fails wsaewouldblock , buffer space becomes available. therefore, application can assume sends possible starting first fd_write network event setting , lasting until send returns wsaewouldblock. after such failure application find out sends again possible when fd_write network event recorded , associated event object set.
so, ideally you're keeping flag whether it's ok write, right now. starts off true, eventually, wsaewouldblock when calling sendto, , set false. once receive fd_write, set flag true , resume sending packets.
Comments
Post a Comment