关于socket设置为非阻塞式出现的问题

yifuzhiming 2014-01-22 02:06:47
我一加上ret = ioctlsocket(sock, FIONBIO,(unsigned long *)&ul);这行代码后,connect就出错了,我想把这个socket设置为非阻塞的,请问如何做啊,谢谢


WSADATA wsaData;
SOCKADDR_IN server_addr;
WORD wVersion;
wVersion = MAKEWORD(2,2);
/*初始化socket资源*/
WSAStartup(wVersion, &wsaData);


//获取长度
int len = WideCharToMultiByte(CP_ACP, 0, ip_p, ip_p.GetLength(), NULL, 0, NULL, NULL);
char * cip = new char[len + 1];
memset(cip, 0x00, len + 1);
//宽字节转多字节
WideCharToMultiByte(CP_ACP, 0, ip_p, ip_p.GetLength(), cip, len, NULL, NULL);
//cip[len+1] = '\0';


//server_addr.sin_addr.s_addr = inet_addr(tmpData);
server_addr.sin_addr.s_addr = inet_addr(cip);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(_ttoi(port_p));
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
//create socket error
check = false;
}
unsigned long ul = 1;
int ret;
ret = ioctlsocket(sock, FIONBIO,(unsigned long *)&ul);//设置成非阻塞模式。
if (connect(sock, (struct sockaddr *) &server_addr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
{
//connect error
check = false;
}
else
{
//连接成功
check = true;
m_bActive = true;
m_connectype = TCPIP;
}
delete []cip;

...全文
812 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 xiaoc1026 的回复:
设置阻塞模式后,判断连接成功不是判断返回值的,在connect 之后加上如下代码判断连接是否成功!

//连接超时设置
	struct timeval tmout ; 
	fd_set r; 

	FD_ZERO(&r); 
	FD_SET(m_Socket, &r); 
	tmout.tv_sec = 15; //连接超时时间
	tmout.tv_usec =0; 
	ret = select(sock, 0, &r, 0, &tmout); 
	if ( ret <= 0 ) 
	{ 
		return FALSE;
	} 
正解!非阻塞的套接字connect函数会立即返回失败的,需要用select检查是否连接成功。
Freedom 2014-02-12
  • 打赏
  • 举报
回复
geitlasterror查看一下错原因
wuleeemail 2014-02-12
  • 打赏
  • 举报
回复
将ul设置为0,也就是ul=0;就设回阻塞模式了。
版主大哥 2014-01-22
  • 打赏
  • 举报
回复
ret = ioctlsocket(sock, FIONBIO,(unsigned long *)&ul);//设置成非阻塞模式。 去掉这句不就是阻塞的?
见习学术士 2014-01-22
  • 打赏
  • 举报
回复
设置阻塞模式后,判断连接成功不是判断返回值的,在connect 之后加上如下代码判断连接是否成功!

//连接超时设置
	struct timeval tmout ; 
	fd_set r; 

	FD_ZERO(&r); 
	FD_SET(m_Socket, &r); 
	tmout.tv_sec = 15; //连接超时时间
	tmout.tv_usec =0; 
	ret = select(sock, 0, &r, 0, &tmout); 
	if ( ret <= 0 ) 
	{ 
		return FALSE;
	} 

18,356

社区成员

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

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