现在的位置: 首页 > 综合 > 正文

linux socket中的地址转换、返回值和setsockopt()来控制recv()与send()的超时

2013年12月06日 ⁄ 综合 ⁄ 共 1724字 ⁄ 字号 评论关闭

地址转换时的htonl和inet_pton

参数是32bit的二进制数值,在转换地址时就是32位的主机字节序ip地址(经常用点分十进制)

用法:servaddr.sin_addr.s_addr=htonl(127.0.0.1);

servaddr.sin_addr.s_addr=htonl(INADDR_ANY); // INADDR_ANY真实值为0.0.0.0

int inet_pton(int family,const char *strptr,void *addrptr);

该函数完成两个功能:1.字符串->二进制数值 2.主机字节序->网络字节序(所以调用此函数后不需htonl了)

第二个参数是ip地址字符串的指针

用法:inet_pton(AF_INET,argv[1],&servaddr.sin_addr);

第三个参数使用&servaddr.sin_addr.s_addr也可以通过

总结:数值型的ip地址转换用htonl,字符串类型的用inet_pton

关于socket阻塞与非阻塞情况下的recv、send、read、write返回值

转自:http://blog.csdn.net/eroswang/archive/2010/06/02/5642550.aspx

1、阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 0接收到数据大小,特别:返回值

2、阻塞模式与非阻塞模式下write的返回值各代表什么意思?有没有区别?

阻塞与非阻塞write返回值没有区分,都是 0发送数据大小,特别:返回值

3、阻塞模式下read返回值

非阻塞模式下read返回值 0表示接收到数据。

这2种模式下的返回值是不是这么理解,有没有跟详细的理解或跟准确的说明?

4、阻塞模式与非阻塞模式下是否send返回值 0则表示发送了数据?send的返回值是否这么理解,阻塞模式与非阻塞模式下send返回值=0是否都是发送失败,还是那个模式下表示暂时不可发送,需要 重发?

用setsockopt()来控制recv()与send()的超时[转]

在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制:

在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,以下是来自于网上一篇文章中的摘录,它是这样写的:

int nNetTimeout=1000;//1秒,

//设置发送超时

setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));

//设置接收超时

setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));

这样做在Linux环境下是不会产生效果的,须如下定义:struct timeval timeout = {3,0};

//设置发送超时

setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));

//设置接收超时

setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));

有两点注意就是:

1)recv ()的第四个参数需为MSG_WAITALL,在阻塞模式下不等到指定数目的数据不会返回,除非超时时间到。还要注意的是只要设置了接收超时,在没有MSG_WAITALL时也是有效的。说到底超时就是不让你的程序老在那儿等,到一定时间进行一次返回而已。

2)即使等待超时时间值未到,但对方已经关闭了socket, 则此时recv()会立即返回,并收到多少数据返回多少数据。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/newger/archive/2008/05/19/2459113.aspx

注:recv()在超时后返回-1。

Powered by Zoundry Raven

抱歉!评论已关闭.