非阻塞socket 如何判断其已建立连接?

blairstar2 2011-11-03 12:57:08
大家好,小弟最近在做一个仪器控制的小项目,碰到一个问题,对于非阻塞的socket,不知道如何判断其已建立连接,比如,现在已经建立连接,但并不知道,如何检查其已建立连接呢?谢谢大家的指导!
...全文
306 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈利路亚1874 2011-11-06
  • 打赏
  • 举报
回复
开线程超时就发测试包不就可以了,在另一端对特定的测试包做过滤,就像检测僵尸连接一样的思路
danscort2000 2011-11-03
  • 打赏
  • 举报
回复
很简单
判断SOCKET是否可写就可以了
在连接没有完成前,基于TCP的SOCKET是不可写的
连接完成后,基于TCP的SOCKET就可写了
Toomj 2011-11-03
  • 打赏
  • 举报
回复
if(SOCKET_ERROR==connect(m_socket,(sockaddr*)&sockaddr, sizeof(sockaddr)))连接失败

叶恭介叶恭介 2011-11-03
  • 打赏
  • 举报
回复
BOOL InitSockt(void)
{
int reVal; //返回值
WSADATA wsData; //WSADATA变量
reVal = WSAStartup(MAKEWORD(2,2),&wsData);//初始化Windows Sockets Dll

//创建套接字
sClient = socket(AF_INET, SOCK_STREAM, 0);
if(INVALID_SOCKET == sClient)
return FALSE;


//设置套接字非阻塞模式
unsigned long ul = 1;
reVal = ioctlsocket(sClient, FIONBIO, (unsigned long*)&ul);
if (reVal == SOCKET_ERROR)
return FALSE;

return TRUE;
}

/**
* 连接服务器
*/
BOOL ConnectServer(void)
{
int reVal; //返回值
sockaddr_in serAddr;//服务器地址

serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(SERVERPORT);
serAddr.sin_addr.S_un.S_addr = inet_addr(SERVERIP);

for (;;)
{
//连接服务器
reVal = connect(sClient, (struct sockaddr*)&serAddr, sizeof(serAddr));

//处理连接错误
if(SOCKET_ERROR == reVal)
{
int nErrCode = WSAGetLastError();
if( WSAEWOULDBLOCK == nErrCode ||//连接还没有完成
WSAEINVAL == nErrCode)
{
continue;
}else if (WSAEISCONN == nErrCode)//连接已经完成
{
break;
}else//其它原因,连接失败
{
continue;
}
}

if ( reVal == 0 )//连接成功
break;
}

bConnecting = TRUE;

return TRUE;
}

以上是摘自精通Windows Sockets网络开发:基于Visual C++实现 的代码,你自己体会吧LZ,里面有判断的.必要时自己下载这PDF来看吧.
向立天 2011-11-03
  • 打赏
  • 举报
回复
发个消息过去请求回应
没人理你就是没连上
要是对方按协议恢复了就是连上了
不过
连接没有什么阻塞不阻塞的说法吧
blairstar2 2011-11-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chengbar 的回复:]
connect();
If no error occurs, connect returns zero.
tcp 建立连接不是有3次握手吗,返回0表明已经建立连接
[/Quote]

谢谢您的回答,但这种方法好像是对阻塞的,对非阻塞的好像不能用这么判断。
sevancheng 2011-11-03
  • 打赏
  • 举报
回复
connect();
If no error occurs, connect returns zero.
tcp 建立连接不是有3次握手吗,返回0表明已经建立连接
blairstar2 2011-11-03
  • 打赏
  • 举报
回复
什么模型都没有,就最简单的非阻塞socket,socket(),connect()这类函数,没用那么深!
Eleven 2011-11-03
  • 打赏
  • 举报
回复
你用的什么IO模型?select,WSAAsyncSelect,WSAEventSelect还是OVERLAPPED IO或者是IOCP??

18,356

社区成员

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

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