socket连接的过程中在select函数里面卡死

孙郎 2014-07-29 03:26:20
直接上代码: 这是我的connect函数。

int err = -1;
int len = sizeof(int);
FD_SET fd = {1, hSocket};
TIMEVAL tv = {dwTimeout, 0};
unsigned long ul = 1;

// 设置为非阻塞模式
ioctlsocket(hSocket, FIONBIO, &ul);

// 连接
if(connect(hSocket, pSocketAddress, nAddrLen) != SOCKET_ERROR)
{
// 连接成功
return (SOCKET_SUCCESS);
}
int iErr = WSAGetLastError();
if(iErr != 10035)
goto CLEAR;

// 检查socket描述符是否可写
if(select(0, NULL, &fd, NULL, &tv) <= 0)
goto CLEAR;

// 取错误标识
if(getsockopt(hSocket, SOL_SOCKET, SO_ERROR, (char*)&err, &len) != (SOCKET_SUCCESS))
goto CLEAR;
if(err != 0)
goto CLEAR;

// 设置为阻塞模式
ioctlsocket(hSocket, FIONBIO, &ul);

// 连接成功
return (SOCKET_SUCCESS);

CLEAR:
SetLastError(WSAGetLastError()); //超时
return (SOCKET_ERROR);
...全文
1343 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dodolo19 2014-09-21
  • 打赏
  • 举报
回复
dwTimeout太久?
dvlinker 2014-07-30
  • 打赏
  • 举报
回复
引用 6 楼 sd_sunlang 的回复:
[quote=引用 5 楼 fishion 的回复:] 看了一下,好像要设置exceptfds http://blog.csdn.net/hanchaoman/article/details/5280929
首先表示感谢! 我看了下,是不是就是说,无论如何,select 函数都会等到时间结束或者满足&fd的要求才会返回,这期间必定会卡住?[/quote] 是的,是这样子的,一般都是开个线程去处理的
孙郎 2014-07-29
  • 打赏
  • 举报
回复
引用 5 楼 fishion 的回复:
看了一下,好像要设置exceptfds http://blog.csdn.net/hanchaoman/article/details/5280929
首先表示感谢! 我看了下,是不是就是说,无论如何,select 函数都会等到时间结束或者满足&fd的要求才会返回,这期间必定会卡住?
fishion 2014-07-29
  • 打赏
  • 举报
回复
看了一下,好像要设置exceptfds http://blog.csdn.net/hanchaoman/article/details/5280929
fishion 2014-07-29
  • 打赏
  • 举报
回复
FD_SET一般是这样使用的 fd_set fd; FD_ZERO(&fd); FD_SET(hSocket, &fd);
孙郎 2014-07-29
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
你connect上后,要发送数据给服务端
我select的目的是检测是否连接成功啊,connect不得返回成功后才能发数据吗?
oyljerry 2014-07-29
  • 打赏
  • 举报
回复
你connect上后,要发送数据给服务端
孙郎 2014-07-29
  • 打赏
  • 举报
回复
if(select(0, NULL, &fd, NULL, &tv) <= 0) 这里卡住,程序无响应,我对异步的理解还有欠缺,时间比较急,还望各位大侠不了赐教!

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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