社区
C语言
帖子详情
windows socket TCP 客户端 如何设置非阻塞?
找点资料真费劲
2014-10-18 09:28:56
在 客户端 阻塞模式 能通 的情况下,我再 在创建客户端套接字后加了这两句想改成非阻塞
int iMode = 1;
ioctlsocket(m_Client,FIONBIO,(u_long FAR*) &iMode);
connect函数返回的总是-1。不知为何?
服务端这样设置却是可用的。。。
还有一个问题是 如何清空socket 发送接收 缓冲区?
望指点。。。。
...全文
965
5
打赏
收藏
windows socket TCP 客户端 如何设置非阻塞?
在 客户端 阻塞模式 能通 的情况下,我再 在创建客户端套接字后加了这两句想改成非阻塞 int iMode = 1; ioctlsocket(m_Client,FIONBIO,(u_long FAR*) &iMode); connect函数返回的总是-1。不知为何? 服务端这样设置却是可用的。。。 还有一个问题是 如何清空socket 发送接收 缓冲区? 望指点。。。。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
qq_22134911
2014-10-18
打赏
举报
回复
非阻塞connect返回-1且errno==EINPROGRESS代表连接正在异步建立,你需要观察write事件的发生并getsockopt检查error。
找点资料真费劲
2014-10-18
打赏
举报
回复
问题源码在此(求找错) #include <stdlib.h> #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") #define SERVER_PORT 2012 void main() { WORD wVersionRequested; WSADATA wsaData; int ret; SOCKET sClient; struct sockaddr_in saServer; BOOL fSuccess = TRUE; //WinSock初始化 wVersionRequested = MAKEWORD(2, 2); ret = WSAStartup(wVersionRequested, &wsaData); if(ret!=0) { printf("WSAStartup() failed!\n"); return; } if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2) { WSACleanup(); printf("Invalid WinSock version!\n"); return ; } sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sClient == INVALID_SOCKET) { WSACleanup(); printf("socket() failed!\n"); return ; } //去掉这两句便是可以以阻塞方式连通的客户端代码!!!!(加上这两句设置非阻塞就不行) int iMode = 1; int iasd=ioctlsocket(sClient,FIONBIO,(u_long FAR*) &iMode); saServer.sin_family = AF_INET; saServer.sin_port = htons(SERVER_PORT); saServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); int nn=SOCKET_ERROR; //连接服务器 while(1) { nn = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer)); int i=GetLastError(); printf("客户端未连接上!%d\n",i); Sleep(1000); while(nn==0) { printf("客户端已连接!\n"); Sleep(1000); } } closesocket(sClient); WSACleanup(); return ; }
找点资料真费劲
2014-10-18
打赏
举报
回复
服务端accept返回>0的值, 我客户端用的是GetLastError() 回复的是10056,connect()返回却是-1
女神打Boss
2014-10-18
打赏
举报
回复
没有见过非阻塞的方式,理解中阻塞是因为发送和接收函数,服务器端的监听函数造成的阻塞 具体的方式我忘记了,好像也要判定是否接收到吧 关注
mujiok2003
2014-10-18
打赏
举报
回复
int WSAGetLastError(void);
得到出错的原因。
MFC
TCP
多
客户端
通信(基于CAsync
Socket
)
一个简单且简陋的小测试程序,支持服务器对某
客户端
,服务器对所有
客户端
,
客户端
之间的通信。
TCP
Socket
基于CAsync
Socket
的
非阻塞
异步通信。效果图详见:http://blog.chinaunix.net/uid-28394603-id-5163195.html
WebServer为什么需要将
socket
设置
为
非阻塞
?
目录一些基本概念解释1.
socket
文件描述符有哪些2.
socket
文件描述符
设置
为阻塞的影响二、使用epoll模型将
socket
设置
为
非阻塞
1.listenfd
非阻塞
2.clientfd
非阻塞
(1)epoll的ET模式(2)epoll返回读写事件,但不一定真的可读写小结 一些基本概念解释 1.
socket
文件描述符有哪些 网络中的
客户端
和服务器进行连接通信时需要建立连接,服务器端需要两个
socket
文件描述符,分别是建立连接时需要的监听文件描述符listenfd和连接完成后的已连接文件描述符clientf
Socket
编程系列之2:
Windows
-API网络编程入门实战
Socket
编程系列初步计划:
Socket
编程系列之1: Linux-API 网络编程入门实战
Socket
编程系列之2:
Windows
-API 网络编程入门实战
Socket
编程系列之3: Muduo 网络编程入门实战
Socket
编程系列之4: Libevent 网络编程入门实战
Socket
编程系列之5: Libcurl 网络编程入门实战
Socket
编程系列之6: Boost-ASIO 网络编程入门实战----------------------------------------------------
Socket
编程系列之2:
Windows
-API网络编程入门实战l Winsock编程接口l UDP程序设计l
TCP
套接口函数l Web客户/服务器程序l 基于
windows
的IO复用机制l UDP广播和多播l 套接字选项l
Windows
套接字I/O模型l 原始套接字与ICMPl WinInet简介与案例实战
C/C++网络编程在
windows
将
socket
设置
为
非阻塞
在
socket
编程中,对于
socket
的读写默认都是阻塞的,但有的情况我们需要将其
设置
为
非阻塞
,比如做多路复用,或者通过select实现连接超时等功能,将
socket
设置
为
非阻塞
,在
windows
和linux中的接口有所不同,在
windows
中使用ioctl
socket
函数,在linux中使用 fcntl函数,下面我们做一个跨平台
设置
阻塞的函数SetBlock。
socket
的阻塞模式和
非阻塞
模式
文章目录
socket
的阻塞模式和
非阻塞
模式如何将
socket
设置
为
非阻塞
模式send和recv函数在阻塞和
非阻塞
模式下的表现
非阻塞
模式下send和recv函数的返回值总结阻塞与
非阻塞
socket
的各自使用场景
socket
的阻塞模式和
非阻塞
模式 如何将
socket
设置
为
非阻塞
模式 无论是
Windows
还是Linux,默认创建的
socket
都是阻塞模式的。 在linux上,我们可以使用fcntl函数或者ioctl函数给创建的
socket
增加O_NONBLOCK标志来将
socket
设置
为
非阻塞
模式。 int o
C语言
69,381
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章