« | September 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | |
| 公告 |
戒除浮躁,读好书,交益友 |
Blog信息 |
blog名称:邢红瑞的blog 日志总数:523 评论数量:1142 留言数量:0 访问次数:9709041 建立时间:2004年12月20日 |

| |
[c++]connect函数的错误处理  原创空间, 软件技术, 电脑与网络
邢红瑞 发表于 2007/10/15 18:36:55 |
这是一个tcp连接的简单问题,但是做起来还是蛮复杂的。首先 返回-1,不是错误,这里主要是错误10035的处理,无法立即完成一个非阻挡性套接字操作(WSAEWOULDBLOCK)。主要因为连接的对方是非阻塞套接字,此时进行数据的send 和reconnect都是错误的。一般使用select来判断socket句柄的可写性,而不是注册事件。如果连接没有完成,select会等待真正的完成,而真正完成时要么是个合法的连接,则select成功,要么非法,则select失败,select只有3种可能,0 超时 -1 错误 或者是socket的个数。 nRet = connect(s, name, namelen); char a[10]; DWORD dwErrorCode = WSAGetLastError(); if(nRet && (WSAEWOULDBLOCK == dwErrorCode)) { timeval tv; fd_set read_set; tv.tv_sec = 18; // 超时限制为18秒 tv.tv_usec = 0; FD_ZERO(&read_set); // read_set FD_SET(s, &read_set); // 将s放入集合read_set中 // 用select() 处理结果 switch(select(s + 1, NULL, &read_set, NULL, &tv)) { case -1: { bSendProxyData = FALSE; DWORD dwErrorCode = WSAGetLastError(); } // sock超时处理 case 0: { // max --; // closesocket(s); } default: } } return 0;//告诉后面程序连接成功。得到的教训是好好看msdn,不要瞎看别的书。 |
|
|