搜索墙首页  编程技术  java  asp  ajax  php  c/c#/c++  数据库  oracle  mysql  db2  操作系统  windows  linux  股吧
首页 > 操作系统 > linux
 1         
1楼  xiaosuo 2010-04-10

Linux connect(2)还有一个不怎么为人所知的属性:如果地址的family是AF_UNSPEC,对于TCP连接将通过发送RST包关闭连接,对于UDP连接将去掉目的地址关联,共同的结果是留下一个未连接的socket,这个socket和刚通过socket(2)创建的socket一样。这使得我们可以通过connect(2)到family是AF_UNSPEC的地址来替代close(2)关闭一个连接,并把这个连接的socket放到一个pool里面,以备后用,因为这能省去一个socket(2)调用的开销。

测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define xconnect(fd, addr, len) \
        do { \
                if (connect(fd, addr, len) < 0) { \
                        fprintf(stderr, "connect error with: %s\n", \
                                strerror(errno)); \
                        exit(EXIT_FAILURE); \
                } \
        } while (0)

int main(int argc, char *argv[])
{
        int retval;
        struct sockaddr_in addr;
        socklen_t len;

        retval = socket(AF_INET, SOCK_STREAM, 0);
        memset(&addr, 0, sizeof(&addr));
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = inet_addr("192.168.235.10");
        addr.sin_port = htons(22);
        len = sizeof(addr);
        xconnect(retval, (struct sockaddr*)&addr, len);
        getsockname(retval, (struct sockaddr*)&addr, &len);
        printf("%d\n", ntohs(addr.sin_port));
        addr.sin_family = AF_UNSPEC;
        xconnect(retval, (struct sockaddr*)&addr, len);
        addr.sin_family = AF_INET;
        addr.sin_port = htons(22);
        xconnect(retval, (struct sockaddr*)&addr, len);
        getsockname(retval, (struct sockaddr*)&addr, &len);
        printf("%d\n", ntohs(addr.sin_port));

        return 0;
}


以下是抓包的输出:

 # tcpdump -i lo -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes
22:43:17.608723 IP 192.168.235.10.60438 > 192.168.235.10.22: S 3365801819:3365801819(0) win 32792 <mss 16396,sackOK,timestamp 21687344 0,nop,wscale 5>
22:43:17.609661 IP 192.168.235.10.22 > 192.168.235.10.60438: S 3378619916:3378619916(0) ack 3365801820 win 32768 <mss 16396,sackOK,timestamp 21687345 21687344,nop,wscale 5>
22:43:17.609690 IP 192.168.235.10.60438 > 192.168.235.10.22: . ack 1 win 1025 <nop,nop,timestamp 21687345 21687345>
22:43:17.610715 IP 192.168.235.10.60438 > 192.168.235.10.22: R 1:1(0) ack 1 win 1025 <nop,nop,timestamp 21687346 21687345>
22:43:17.613609 IP 192.168.235.10.60439 > 192.168.235.10.22: S 3365834590:3365834590(0) win 32792 <mss 16396,sackOK,timestamp 21687349 0,nop,wscale 5>
22:43:17.614335 IP 192.168.235.10.22 > 192.168.235.10.60439: S 3372878782:3372878782(0) ack 3365834591 win 32768 <mss 16396,sackOK,timestamp 21687350 21687349,nop,wscale 5>
22:43:17.614351 IP 192.168.235.10.60439 > 192.168.235.10.22: . ack 1 win 1025 <nop,nop,timestamp 21687350 21687350>
22:43:17.614633 IP 192.168.235.10.60439 > 192.168.235.10.22: F 1:1(0) ack 1 win 1025 <nop,nop,timestamp 21687350 21687350>
22:43:17.617225 IP 192.168.235.10.22 > 192.168.235.10.60439: . ack 2 win 1024 <nop,nop,timestamp 21687353 21687350>
22:43:17.729908 IP 192.168.235.10.22 > 192.168.235.10.60439: P 1:22(21) ack 2 win 1024 <nop,nop,timestamp 21687465 21687350>
22:43:17.729943 IP 192.168.235.10.60439 > 192.168.235.10.22: R 3365834592:3365834592(0) win 0

我们尽量在收到对方的FIN包,也就是read(2)等返回0的时候再调用connect(AF_UNSPEC)关闭连接,防止造成误会。

可能的应用:反向HTTP代理中,由代理服务器发往HTTP服务器的连接。
2楼  CUDev  2010-04-11 11:47:02

请问你的内核版本是多少,我在debian 2.6.30-1-686上测试没有成功,直接RST断掉了,没有第二次的三次握手
3楼  CUDev  2010-04-11 11:53:33

找到问题了,是因为你的代码中。
getsockname(retval, (struct sockaddr*)&addr, &len);
覆盖了原先设置的addr,这样最后的xconnect连接的就是本机了。
 1         
您的发言将按有关规定都会存档,您须为所发表后果负责,请您遵纪守法并注意语言文明。
标题:connection socket pool
热门关注
标题回复点击
d7se77dy/77dy电影. 77dy是77dy宽频和77dy1331673
黄网最新地址0903
IPP2P模块修改版,最新0.99.16440828
zeh 4.p patch on RHEL 30744
将 Puppy Linux 4.00 安装在U盘里 打造随身系统2695
Apache 超全0689
gcc glibc kernel 版本兼容性 reference0684
[保留]7667
d7se77dy/77dy电影. 77dy是77dy宽频和77dy156650
linux 有啥低级格式化硬盘的软件1644
搜索墙@2009 www.pkwall.com all rights reserved QQ:276471788 [京ICP备09111534号]
声明:本站部分数据来源于网络,仅供参考,如有版权问题,请联系我们,我们将及时删除!转载本站请注明来源