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

在学习孙鑫老师的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;
}

再次编译,调试成功!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值