Tcp ip recv总是返回10060,但又能正常接收发送数据?

t101706 2013-04-03 10:59:26

bool CCoffee::Connect(void)
{
u_long ulTmp;
SOCKADDR_IN SockAddr;

Disconnect(); // 断开连接

// 创建socket
mc_SendSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
if(mc_SendSocket == INVALID_SOCKET)
goto ErrEntry;

// 设置socket为阻塞方式
ulTmp = 0;
if(ioctlsocket(mc_SendSocket, FIONBIO, &ulTmp) != 0)
goto ErrEntry;

// 设置socket发送超时
if(setsockopt(mc_SendSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&mc_nSendTimeOut, sizeof(mc_nSendTimeOut)) != 0)
goto ErrEntry;

if(setsockopt(mc_SendSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&mc_nRecvTimeOut, sizeof(mc_nRecvTimeOut)) != 0)
goto ErrEntry;
// 连接服务端
InitSockAddr(&SockAddr, mc_ServerIpAddr.GetBuffer(), mc_Port);
if(connect(mc_SendSocket, (sockaddr *)&SockAddr, sizeof(SOCKADDR_IN)) != 0)
goto ErrEntry;


return TRUE;
ErrEntry:
int i = GetLastError();
Disconnect();
return FALSE;
}

void CCoffee::SendRecv(void)
{
char Buf[32768] = {0}; // 接收缓冲区
int nErr;
while(true)
{
memset(Buf,0,32768);
nErr = recv(mc_SendSocket, Buf, 32768, 0);

if(nErr == SOCKET_ERROR) // 有错误发生
{
nErr = WSAGetLastError();
if(nErr == WSAECONNRESET) {
// socket连接被peer端关闭,虚电路复位等错误,出现此类型的错误时socket必须被关闭。
//ForcePostMessage(WM_SOCKETCLOSE, 0, (LPARAM)m_pTcpClient);
break;
}
else
{

//ForcePostMessage(WM_SOCKETRECVERR, 0, (LPARAM)m_pTcpClient);
}
}
else if(nErr == 0) // socket被动关闭
{
//ForcePostMessage(WM_SOCKETCLOSE, 0, (LPARAM)m_pTcpClient);
break;
}
else // 接收到数据
{
SendDoRecv(Buf, nErr); // 处理接收到的数据
}
}; // while
}



...全文
350 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
10060是由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败 我没有看懂楼主的程序。 InitSockAddr(&SockAddr, mc_ServerIpAddr.GetBuffer(), mc_Port); 初始化服务端的地址和端口,连接 然后recv指定监听 32768端口。没有看到你bind这个端口啊 服务器发给客户端的数据,是发到32768端口上吗?
shen_wei 2013-04-03
  • 打赏
  • 举报
回复
if(setsockopt(mc_SendSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&mc_nSendTimeOut, sizeof(mc_nSendTimeOut)) != 0)
        goto ErrEntry;
     
    if(setsockopt(mc_SendSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&mc_nRecvTimeOut, sizeof(mc_nRecvTimeOut)) != 0)
        goto ErrEntry;
这里发送了两次。。

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧