红联Linux门户
Linux帮助

Linux内核3.7 TCP Fast Open验证实例

发布时间:2015-12-02 10:00:19来源:linux网站作者:李寒辉的技术日记

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);   // Create socket 

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));  // Bind to well known address 

int qlen = 5; // Value to be chosen by application 
int err = setsockopt(sfd, IPPROTO_TCP/*SOL_TCP*/, 23/*TCP_FASTOPEN*/, &qlen, sizeof(qlen)); 

listen(sfd,1);// Mark socket to receive connections 

cfd = accept(sfd, NULL, 0);   // Accept connection on new socket 
while(1){ 
int len = read(cfd,buffer,256); 
if(len) 
printf("tcp fast open: %s\\n",buffer); 
else 
break; 
// read and write data on connected socket cfd 
}
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/*MSG_FASTOPEN*/,  
(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