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 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_22134911 2014-10-18
  • 打赏
  • 举报
回复
非阻塞connect返回-1且errno==EINPROGRESS代表连接正在异步建立,你需要观察write事件的发生并getsockopt检查error。
  • 打赏
  • 举报
回复
问题源码在此(求找错) #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 ; }
  • 打赏
  • 举报
回复
服务端accept返回>0的值, 我客户端用的是GetLastError() 回复的是10056,connect()返回却是-1
女神打Boss 2014-10-18
  • 打赏
  • 举报
回复
没有见过非阻塞的方式,理解中阻塞是因为发送和接收函数,服务器端的监听函数造成的阻塞 具体的方式我忘记了,好像也要判定是否接收到吧 关注
mujiok2003 2014-10-18
  • 打赏
  • 举报
回复
int WSAGetLastError(void);
得到出错的原因。

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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