One last IOCP question :)
-
sure:
int Recieve(char\* buffer, size\_t buflen){ if (m\_iLastRecieved > 0){ //Were expecting a second packed m\_wsaBuf.len = static\_cast(buflen) - m\_iTotalRecieved; m\_wsaBuf.buf = buffer + m\_iTotalRecieved; m\_wsaBuf.buf\[0\] = 0; } else{ buffer\[0\] = 0; m\_wsaBuf.len = static\_cast(buflen); m\_wsaBuf.buf = buffer; } static int sockaddr\_len = sizeof(sockaddr\_in); DWORD temp(0); setStatus(RequestRecieve); //returning 0 is ok return (PostQueuedCompletionStatus(m\_hIOCP, 1, reinterpret\_cast(this), getOverlapped()) == FALSE); }
Thats where i make my request to post. You might wonder if it aint dangerous for the buffer to overflow or something but most of the checking goes outside this function and i can assure that there is no overflow since i'm only testing with 1 game which is secured in any way i know off. The requested bytes is unknown, it can variate depending on the used game from like 100 to a few packets of 1500 kb however mostly its just something like 1 packet with 600 bytes (i know because my previous version of the application worked perfectly, only it wasnt using IOCP just the lame one thread per server way ) anyways, with this topic still being open and all, there is one other ugly thing i cant find a good solution for. Is there any way to close a overlapped operation because i need to reuse the overlapped structures, and that means that if there is a timeout check function somewhere in my application just running once in a while over all the overlapped operations looking if they arent timed out because it could hapen that one of the 1000 servers wont give a response for some or other reason and else the overlapped structure would be in use all the time waiting for nothing to come.
Polity4h wrote:
to a few packets of 1500 kb
1500KB? That's too big for a UDP datagram :) All I can think of is check all your send and receive counts on both ends in the debugger. With UDP you should be receiving complete datagrams the size that were sent (providing they arrive successfully - UDP doesn't guarantee that). Why do you use UDP? Have you allowed for messages that don't make it?
Polity4h wrote:
Is there any way to close a overlapped operation because i need to reuse the overlapped structures, and that means that if there is a timeout check function somewhere in my application just running once in a while over all the overlapped operations looking if they arent timed out...
The only way I know is to close the socket. Any pending queued overlapped operations on the socket will be released by GetQueuedCompletionStatus(). If you want to check periodically then you could use a timer, the dwMilliseconds parameter to GetQueuedCompletionStatus(), or some other method. Close the socket after the appropriate period of inactivity.
-
sure:
int Recieve(char\* buffer, size\_t buflen){ if (m\_iLastRecieved > 0){ //Were expecting a second packed m\_wsaBuf.len = static\_cast(buflen) - m\_iTotalRecieved; m\_wsaBuf.buf = buffer + m\_iTotalRecieved; m\_wsaBuf.buf\[0\] = 0; } else{ buffer\[0\] = 0; m\_wsaBuf.len = static\_cast(buflen); m\_wsaBuf.buf = buffer; } static int sockaddr\_len = sizeof(sockaddr\_in); DWORD temp(0); setStatus(RequestRecieve); //returning 0 is ok return (PostQueuedCompletionStatus(m\_hIOCP, 1, reinterpret\_cast(this), getOverlapped()) == FALSE); }
Thats where i make my request to post. You might wonder if it aint dangerous for the buffer to overflow or something but most of the checking goes outside this function and i can assure that there is no overflow since i'm only testing with 1 game which is secured in any way i know off. The requested bytes is unknown, it can variate depending on the used game from like 100 to a few packets of 1500 kb however mostly its just something like 1 packet with 600 bytes (i know because my previous version of the application worked perfectly, only it wasnt using IOCP just the lame one thread per server way ) anyways, with this topic still being open and all, there is one other ugly thing i cant find a good solution for. Is there any way to close a overlapped operation because i need to reuse the overlapped structures, and that means that if there is a timeout check function somewhere in my application just running once in a while over all the overlapped operations looking if they arent timed out because it could hapen that one of the 1000 servers wont give a response for some or other reason and else the overlapped structure would be in use all the time waiting for nothing to come.
Cancel Overlapped Socket Op Update: From a Larry Osterman (Microsoft engineer) blog, apparently you can use CancelIo(), casting your socket handle to a "HANDLE". Give it a try - worst that can happen is it fails :) Mark
-
Cancel Overlapped Socket Op Update: From a Larry Osterman (Microsoft engineer) blog, apparently you can use CancelIo(), casting your socket handle to a "HANDLE". Give it a try - worst that can happen is it fails :) Mark
CancelIo doesnt work, the thing is that it needs to be ran from the same thread where Overlapped operations were posted. I could however close the socket and open it again, but what are the drawbacks of this? this means that i need to close and open like 20 sockets per second in the future. looks really hard to me, but i cant really figure out what might happen when i do this.
-
CancelIo doesnt work, the thing is that it needs to be ran from the same thread where Overlapped operations were posted. I could however close the socket and open it again, but what are the drawbacks of this? this means that i need to close and open like 20 sockets per second in the future. looks really hard to me, but i cant really figure out what might happen when i do this.
Polity4h wrote:
CancelIo doesnt work, the thing is that it needs to be ran from the same thread where Overlapped operations were posted.
Yeah I thought about that since you are posting overlapped ops from your worker thread(s) :) 20 sockets per second? How long is the time you are willing to wait before the remote node is considered inactive??
-
Polity4h wrote:
CancelIo doesnt work, the thing is that it needs to be ran from the same thread where Overlapped operations were posted.
Yeah I thought about that since you are posting overlapped ops from your worker thread(s) :) 20 sockets per second? How long is the time you are willing to wait before the remote node is considered inactive??
alright, i might have thought a bid to far in the future were i got myself a mainframe ;) << -_- whatever, anyways, lets say 2 sockets needs to be created per second. wont this kill my system after doing this a long time ( my app needs to run constantly for, count them up a few years ) << thats the perfect vision ofcourse.
-
alright, i might have thought a bid to far in the future were i got myself a mainframe ;) << -_- whatever, anyways, lets say 2 sockets needs to be created per second. wont this kill my system after doing this a long time ( my app needs to run constantly for, count them up a few years ) << thats the perfect vision ofcourse.
I'm not sure what you are trying to do. Why do you need to keep creating sockets but never destroy them? Surely you'll run out of sockets if you do that :)
-
I'm not sure what you are trying to do. Why do you need to keep creating sockets but never destroy them? Surely you'll run out of sockets if you do that :)
...I could however close the socket and open it again, but what are the drawbacks of this? this means that i need to close and open like 20 sockets per second in the future... hehe, anyways your saying that your server wont suffer to hard when creating AND DESTROYING lets say 2 sockets per second?
-
...I could however close the socket and open it again, but what are the drawbacks of this? this means that i need to close and open like 20 sockets per second in the future... hehe, anyways your saying that your server wont suffer to hard when creating AND DESTROYING lets say 2 sockets per second?
No. As long as that's really what your app needs to do. :) Think about how many TCP sockets a busy web (HTTP) server must open and close per second. 20 per second is nothing :) Mark
-
No. As long as that's really what your app needs to do. :) Think about how many TCP sockets a busy web (HTTP) server must open and close per second. 20 per second is nothing :) Mark
-
...I could however close the socket and open it again, but what are the drawbacks of this? this means that i need to close and open like 20 sockets per second in the future... hehe, anyways your saying that your server wont suffer to hard when creating AND DESTROYING lets say 2 sockets per second?
*EDIT* Having a pool of sockets could improve performance - that way only ConnectEx/DisconnectEx needs to be called on a socket instead of recreating/destoying the entire socket every time. Mark
-
*EDIT* Having a pool of sockets could improve performance - that way only ConnectEx/DisconnectEx needs to be called on a socket instead of recreating/destoying the entire socket every time. Mark
src=msdn:The Windows Sockets ConnectEx function establishes a connection to a specified socket, and optionally sends data (called connect data) once the connection is established. The ConnectEx function is only supported on connection-oriented sockets. remember, i'm forced to use connectionless protocols :) thanks anyway
-
src=msdn:The Windows Sockets ConnectEx function establishes a connection to a specified socket, and optionally sends data (called connect data) once the connection is established. The ConnectEx function is only supported on connection-oriented sockets. remember, i'm forced to use connectionless protocols :) thanks anyway
Gotcha man :) I was just extending my comment about TCP sockets on an HTTP server :)