是服务器端的程序,使用的是TCP协议,非阻塞方式。接收缓冲区为buf, 需要接收的字节数为n,程序如下;
case WM_SOCKET:
{
switch(LOWORD(lParam))
{
case FD_READ:
{
int iRecv = 0, iret;
while(iRecv < n)
{
if((iret = recv(wParam, buf + iRecv, n - iRecv, 0)) == SOCKET_ERROR)
if(WSAGetLastError() == WSAEWOULDBLOCK)
continue;
else
goto close;
iRecv += iret;
}
}
}
}
我的想法是,当服务器收到FD_READ消息时,用recv接收数据。需要接收的数据是n字节,缓冲区是buf,已经接收的字节是iRecv,这样的话,接收缓冲区就应该写成buf + iRecv(对吗?),而接收字节数就应该写成n - iRecv(对吗?)
这样while循环下去(其实很有可能一次就完成了,接收的数据量很小,几十个字节),如果收不到足够的字节数,它就会一直在这里面循环。而不会退出此消息处理(这样做对吗?会不会造成死循环?这样做似乎是非得收到iRecv,否则不退出循环)。
------解决思路----------------------
这个while是没必要的
你需要的是一个数据缓冲区
然后把接收到的数据全部塞到里面
档处理完一帧数据后,把那段数据删除
------解决思路----------------------
你每个客户端来了都是一个独立的缓冲区
另外我建议你的服务端用client模型
客户端用server模型
然后你的服务端启动后向client端发udp请求过来连接
然后建立稳定的TCP通信