getsockopt和accept需要注意的两个细节
2014-06-20 12:01
218 查看
1,getsockopt连续调用问题
通常情况下,在一个socket fd上出现错误时,我们会通过
这种方法来获取具体的错误原因。
如果fd上出现了错误,那么第一次调用getsockopt会通过status返回错误原因。如果此时并没有调用close(fd),按理说这个错误在fd上依然存在,但是如果再次调用上面的getsockopt,则会告知用户此fd上没有任何错误。。。这种情况经常会发生在函数之间传递fd时,一个函数A里面做了getsockopt判断,之后将fd传至别的函数B,函数B不知道fd的状态,再次调用getsockopt,会误认为fd上没有错误了。
所以如果在fd上没有任何读写操作的话,fd上的getsockopt要只调用一次,之后,要将该次getsockopt的状态和fd一起传递给别的函数。免得出现上面的问题。
2,accept的参数问题
通常情况下,一个socket fd上等待请求,会像下面这样做:
这样是一个成功的accept调用,但是在accept返回后,你无法通过cliaddr拿到对端的IP信息。你会发现你用inet_ntop(AF_INET, &cliaddr, ip_buf, sizeof(ip_buf))得到的竟然是一个乱七八糟的对端IP地址。
正确的做法是这样:
看出差别了吗?
通常情况下,在一个socket fd上出现错误时,我们会通过
int status; socklen_t slen; getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *) &status, &slen);
这种方法来获取具体的错误原因。
如果fd上出现了错误,那么第一次调用getsockopt会通过status返回错误原因。如果此时并没有调用close(fd),按理说这个错误在fd上依然存在,但是如果再次调用上面的getsockopt,则会告知用户此fd上没有任何错误。。。这种情况经常会发生在函数之间传递fd时,一个函数A里面做了getsockopt判断,之后将fd传至别的函数B,函数B不知道fd的状态,再次调用getsockopt,会误认为fd上没有错误了。
所以如果在fd上没有任何读写操作的话,fd上的getsockopt要只调用一次,之后,要将该次getsockopt的状态和fd一起传递给别的函数。免得出现上面的问题。
2,accept的参数问题
通常情况下,一个socket fd上等待请求,会像下面这样做:
int clifd, clilen; sockaddr_in cliaddr; clifd = accept(listen_fd, (struct sockaddr*) &cliaddr, &clilen);
这样是一个成功的accept调用,但是在accept返回后,你无法通过cliaddr拿到对端的IP信息。你会发现你用inet_ntop(AF_INET, &cliaddr, ip_buf, sizeof(ip_buf))得到的竟然是一个乱七八糟的对端IP地址。
正确的做法是这样:
sockaddr_in cliaddr; int clifd, clilen = sizeof(cliaddr); clifd = accept(listen_fd, (struct sockaddr*) &cliaddr, &clilen);
看出差别了吗?
相关文章推荐
- 做多维数据集需要注意的两个细节
- 使用TIMESTAMPDIFF计算两个时间戳之间的时间间隔需要注意的细节
- vector构建和销毁需要注意的两个问题
- Java编程中那些需要注意的细节
- webpack编译react需要注意的细节
- 当javaScript从入门到提高前需要注意的细节:对象部分
- 当javaScript从入门到提高前需要注意的细节:对象部分
- Servlet需要注意的细节(重要)
- 编写SQL需要注意的细节Checklist总结
- 职场上千万要注意这两个小细节
- linux中read函数需要注意的细节
- 第七题:牛牛拿到了一个藏宝图,顺着藏宝图的指示,牛牛发现了一个藏宝盒,藏宝盒上有一个机关,机关每次会显示两个字符串 s 和 t,根据古老的传说,牛牛需要每次都回答 t 是否是 s 的子序列。注意,子序列不要求在原字符串中是连续的,例如串 abc,它的子序列就有 {空串, a, b, c, ab, ac, bc, abc} 8 种。
- JavaScript使用需要注意的细节
- mysql5.7安装两个需要注意的地方
- 写正确函数需要注意的地方:两个序列a,b,大小都为n,序列元素的值为任意整数,无序;要求通过交换a,b中的元素,使序列a元素的和与序列b元素的和之间的差最小
- 使用Spring的Service注入Dao接口需要注意的细节问题
- GridView、FromView、DetailsView实现主从表需要注意的几个细节
- Java transient关键字使用小结及一些需要注意的细节
- MySQL处理空值时你需要注意的两个问题
- Object-C中需要注意的细节