免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11768 | 回复: 15
打印 上一主题 下一主题

[C] 如何将代码中的套接字设置为非阻塞? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-19 17:08 |只看该作者 |倒序浏览
  1. ......................................................................
  2. ......................................................................

  3.     WSADATA wsaData;
  4.     int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
  5.     if ( iResult != NO_ERROR )
  6.         printf("Error at WSAStartup()\n");

  7.         /*---- Create Socket ----*/
  8.         sock = socket (AF_INET, SOCK_STREAM, 0);

  9.         if (sock == INVALID_SOCKET) {
  10.                 fprintf (stderr, "can not create socket\n");
  11.                 return -2;
  12.         }

  13.         /*---- apply non-block model ----*/
  14.         //fcntl (sock, F_SETFL, O_NONBLOCK | fcntl (sock, F_GETFL)); // linux下设置非阻塞
  15.         //fcntl (sock, F_SETFD, FD_CLOEXEC | fcntl (sock, F_GETFD)); // linux下调用exec时的状态

  16.         memset (&saddr, 0, sizeof (saddr));

  17.         saddr.sin_addr.s_addr = inet_addr (url->host));                       
  18.         saddr.sin_family = AF_INET; /* host byte order */
  19.         saddr.sin_port = htons (atoi (url->port));/* short, network byte order */

  20.                status = connect (sock, (struct sockaddr *) &saddr, sizeof (struct sockaddr_in));

  21. ......................................................................
  22. ......................................................................
复制代码


请问上面这段代码在windows下可以用什么函数来替代fcntl()函数的功能:
  1. fcntl (sock, F_SETFL, O_NONBLOCK | fcntl (sock, F_GETFL));
  2. fcntl (sock, F_SETFD, FD_CLOEXEC | fcntl (sock, F_GETFD));
复制代码

[ 本帖最后由 lp5913 于 2008-1-19 17:21 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-01-20 16:33 |只看该作者
ioctlsocket

论坛徽章:
0
3 [报告]
发表于 2008-01-20 16:45 |只看该作者
原帖由 xi2008wang 于 2008-1-20 16:33 发表
ioctlsocket

windows下也能这么用?

论坛徽章:
0
4 [报告]
发表于 2008-01-20 16:50 |只看该作者
用select嘛.

论坛徽章:
0
5 [报告]
发表于 2008-01-20 16:51 |只看该作者
原帖由 SST中国 于 2008-1-20 16:50 发表
用select嘛.

汗,select也不是设置套接字非阻塞的啊。

论坛徽章:
0
6 [报告]
发表于 2008-01-20 16:55 |只看该作者
原帖由 cugb_cat 于 2008-1-20 16:51 发表

汗,select也不是设置套接字非阻塞的啊。


难道你做人做事不懂得变通吗?select 完全能实现顶楼的功能,为什么不可.汗什么.有那么多汗赶紧去擦擦.

论坛徽章:
0
7 [报告]
发表于 2008-01-20 16:59 |只看该作者

论坛徽章:
0
8 [报告]
发表于 2008-01-20 17:07 |只看该作者
原帖由 SST中国 于 2008-1-20 16:55 发表


难道你做人做事不懂得变通吗?select 完全能实现顶楼的功能,为什么不可.汗什么.有那么多汗赶紧去擦擦.
请问上面这段代码在windows下可以用什么函数来替代fcntl()函数的功能:


看清楼主的问题~~~

论坛徽章:
0
9 [报告]
发表于 2008-01-20 17:08 |只看该作者
原帖由 xi2008wang 于 2008-1-20 16:59 发表
http://baike.baidu.com/view/569202.htm

恩,那就应该是这个了,前面我以为ioctlsocket是两个词呢,呵呵。

论坛徽章:
0
10 [报告]
发表于 2008-01-21 09:16 |只看该作者
ioctlsocket()可以把套接字设置为非阻塞模式,但是我设置成非阻塞模式之后。
  1. status = connect (sock, (struct sockaddr *) &saddr,  sizeof (struct sockaddr_in));
复制代码

上面connect总是出错,错误是:
  1. WSAEWOULDBLOCK:套接口设置为非阻塞方式且连接不能立即建立。
复制代码


通过ioctlsocket函数可以把套接字设置为非阻塞和阻塞模式,如果我设成阻塞模式,对程序没有任何影响,
但是设成非阻塞模式之后connect()就会出现上面的错误。

  1.         if (ioctlsocket(sock, FIONBIO, (unsigned long *) &lret) == SOCKET_ERROR)
  2.         {
  3.                 printf("\n----------\n设置阻塞套接字失败!\n----------\n\n");
  4.                 fprintf (stderr, "(%d)%s\n", errno, strerror (errno));
  5.                 Sleep (2000);
  6.         }else
  7.         {
  8.                 printf("\n----------\n设置非阻塞套接字成功!\n----------\n\n");
  9.                 Sleep (2000);
  10.         }
复制代码

加上上面的ioctlsocket()函数代码设置套接字connect总是提示错误。但是单独加上下面的代码设置套接字可以connect成功下载页面。只是不知道这样调用select函数,套接字是否被设置为了非阻塞模式??
  1.         FD_ZERO (&fdread);
  2.         FD_ZERO (&fdwrite);
  3.         FD_SET (sock, &fdread);
  4.         FD_SET (sock, &fdwrite);
  5.         if ((ret = select(0, &fdread, &fdwrite, NULL, &tv)) == SOCKET_ERROR)
  6.         {
  7.                 printf("\n----------\nselect函数调用失败!\n----------\n\n");
  8.                 fprintf (stderr, "(%d)%s\n", errno, strerror (errno));
  9.                 WSACleanup ();
  10.         }else
  11.         {
  12.                 printf("\n----------\nselect函数调用成功!\n----------\n\n");
  13.         }
复制代码

另外请对这些函数熟悉给解释一下他们的区别。

[ 本帖最后由 lp5913 于 2008-1-21 17:09 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP