您的位置:首页 > 理论基础 > 计算机网络

MFC 孙鑫 15.6网络聊天室创建 recvfrom返回1054

2018-03-08 21:24 302 查看
在学习孙鑫老师的VC++深入解析时,15.6章多线程的学习中例子网络聊天室创建一直有问题。
系统:win7 sp1 IDE:VC2013
首先打断点查看,发现recvfrom返回-1;加入代码查看具体错误while (TRUE)
{
retval = recvfrom(sock, recvBuf, 200, 0, (SOCKADDR*) & addrFrom, &len);
if (SOCKET_ERROR == retval)
{
char str1[10];
_itoa_s(WSAGetLastError(), str1, 10);
break;
}

sprintf_s(tempBuf, "%s说:%s", inet_ntoa(addrFrom.sin_addr), recvBuf);
::PostMessage(hwnd, WM_RECVDATA, 0, (LPARAM)tempBuf);
}通过百度发现是winsock自已的bug。具体原因是:http://support.microsoft.com/kb/263823/
解决办法:
在InitSocket()函数返回值前加入如下代码BOOL CChat1Dlg::InitSocket()
{

//创建套接字
m_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (INVALID_SOCKET == m_socket)
{
MessageBox("套接字创建失败");
return FALSE;
}
SOCKADDR_IN addrSock;
addrSock.sin_family = AF_INET;
addrSock.sin_port = htons(6000);
addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

int retval;
//绑定套接字
retval = bind(m_socket, (SOCKADDR *)&addrSock, sizeof(SOCKADDR));
if (SOCKET_ERROR == retval)
{
closesocket(m_socket);
MessageBox("绑定失败");
return FALSE;
}
DWORD dwBytesReturned = 0;
BOOL bNewBehavior = FALSE;
DWORD status;

#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12)
// disable new behavior using
// IOCTL: SIO_UDP_CONNRESET
status = WSAIoctl(m_socket, SIO_UDP_CONNRESET,
&bNewBehavior, sizeof(bNewBehavior),
NULL, 0, &dwBytesReturned,
NULL, NULL);

if (SOCKET_ERROR == status)
{
DWORD dwErr = WSAGetLastError();
if (WSAEWOULDBLOCK == dwErr)
{
// nothing to do
return(FALSE);
}
else
{
printf("WSAIoctl(SIO_UDP_CONNRESET) Error: %d/n", dwErr);
return(FALSE);
}
}

return TRUE;
}
再次编译,调试成功!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  recvfrom 10054