Linux内核在 3.6和 3.7合入了 TCP Fast Open特性,在 3.7.3版本上验证了一下, I did it!
以下是C 语言实例(LWN 介绍 ):
server端代码:
#include <string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <netinet/in.h> int main(){ int portno = 5060; socklen_t clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int cfd; int sfd = socket(AF_INET, SOCK_STREAM, 0); bzero((char *) &serv_addr, sizeof (serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); bind(sfd, &serv_addr,sizeof (serv_addr)); int qlen = 5; int err = setsockopt(sfd, IPPROTO_TCP , 23 , &qlen, sizeof (qlen)); listen(sfd,1); cfd = accept(sfd, NULL, 0); while (1){ int len = read(cfd,buffer,256); if (len) printf("tcp fast open: %s\\n" ,buffer); else break ; } close(cfd); }
client端代码:
#include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <errno.h> int main(){ struct sockaddr_in serv_addr; struct hostent *server; char *data = "Hello, tcp fast open" ; int data_len = strlen(data); int sfd = socket(AF_INET, SOCK_STREAM, 0); server = gethostbyname("localhost" ); bzero((char *) &serv_addr, sizeof (serv_addr)); serv_addr.sin_family = AF_INET; bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); serv_addr.sin_port = htons(5060); int len = sendto(sfd, data, data_len, 0x20000000 , (struct sockaddr *) &serv_addr, sizeof (serv_addr)); printf("error: %s\\n" ,strerror(errno)); close(sfd); sleep(5); }
执行结果:
# ./server
tcp fast open: Hello, tcp fast open
# ./client
error: Success
环境: Fedora 18升级内核到3 .7.3; glibc 2.17; gcc 4.7.2
记得要执行:
echo 1 > /proc/sys/net/ipv4/tcp_fastopen