社区
网络编程
帖子详情
非阻塞socket 如何判断其已建立连接?
blairstar2
2011-11-03 12:57:08
大家好,小弟最近在做一个仪器控制的小项目,碰到一个问题,对于非阻塞的socket,不知道如何判断其已建立连接,比如,现在已经建立连接,但并不知道,如何检查其已建立连接呢?谢谢大家的指导!
...全文
353
9
打赏
收藏
非阻塞socket 如何判断其已建立连接?
大家好,小弟最近在做一个仪器控制的小项目,碰到一个问题,对于非阻塞的socket,不知道如何判断其已建立连接,比如,现在已经建立连接,但并不知道,如何检查其已建立连接呢?谢谢大家的指导!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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??
Linux客户端使用
非阻塞
方式进行
Socket
连接
编程
在Linux环境下,进行网络编程时,经常需要使用
Socket
来
建立
与服务器的
连接
。传统的
Socket
连接
方式是阻塞的,即在
连接
建立
之前,程序会一直等待直到
连接
建立
或者超时。然而,在某些情况下,阻塞
连接
方式可能会导致程序的性能下降,因此我们可以使用
非阻塞
方式进行
Socket
连接
编程。通过将
Socket
设置为
非阻塞
模式,我们可以在
连接
建立
过程中进行轮询,并在
连接
成功时继续执行后续操作。集合来监听
Socket
的写操作,如果
Socket
可写,则表示
连接
已
建立
成功。因此,在
连接
建立
过程中,我们需要使用。
Linux
socket
非阻塞
connect方法(一)
Linux
非阻塞
connect方法(linux non-blocking
socket
connect)
socket
编程 ——
非阻塞
socket
在上一篇文章 《
socket
编程——一个简单的例子》 http://blog.csdn.net/wind19/archive/2011/01/21/6156339.aspx 中写了一个简单的tcp
socket
通信程序,可以进行数据的交互,但有一个问题是这个程序是阻塞的,任何
socket
函数都要等返回后才能进行下一步动作,如果recv一直没有数据,那么就一直不会返回,整个进程就阻塞在那。所以我们要进行改造一下,让程序不再阻塞在那,而是在有数据到来的时候读一下数据,有数据要写的时候发送一下数据。
Socket
中如何设置
连接
超时-通过测试(VC)
设置connect超时很简单,CSDN上也有人提到过使用select,但却没有一个令人满意与完整的答案。偶所讲的也正是select函数,此函数集成在winsock1.1中,简单点讲,"作用使那些想避免在套接字调用过程中被锁定的应用程序,采取一种有序的方式,同时对多个套接字进行管理"(《Windows网络编程技术》原话)。使用方法与解释请见《Windows网络编程技术》。
在使用此函数前,需先将
socket
设置为
非阻塞
模式,这样,在connect时,才会立马跳过,同时,通常也会产生一
Socket
中如何设置
连接
超时-通过测试
设置connect超时很简单,CSDN上也有人提到过使用select,但却没有一个令人满意与完整的答案。偶所讲的也正是select函数,此函数集成在winsock1.1中,简单点讲,"作用使那些想避免在套接字调用过程中被锁定的应用程序,采取一种有序的方式,同时对多个套接字进行管理"(《Windows网络编程技术》原话)。使用方法与解释请见《Windows网络编程技术》。
在使用此函数前,需先将
socket
设置为
非阻塞
模式,这样,在connect时,才会立马跳过,同时,通
网络编程
18,356
社区成员
64,164
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章