2011-04-01 73 views
0

我们需要一些TCP客户端服务器代码的帮助。来自其连接调用和服务器的客户端超时不会从接受中返回。这是strace。TCP服务器接受调用不返回

strace -p 7167 -p 7168 -p 7297 
Process 7167 attached - interrupt to quit 
Process 7168 attached - interrupt to quit 
Process 7297 attached - interrupt to quit 
[pid 7167] accept(4, <unfinished ...> 
[pid 7168] accept(4, <unfinished ...> 
[pid 7297] connect(3, {sa_family=AF_INET, sin_port=htons(24465), sin_addr=inet_addr("215.47.142.168")}, 16 

我们重新启动了系统,但问题仍然存在,即使重新启动后也会立即生效。

它可能是SYN Flood问题。我们如何处理这种关系?另外,一半的连接在监听队列(监听调用的参数2)中排队,并停止从任何客户端进一步接受,或者TCP是否仅仅阻止该特定客户端。

下面的代码...... client.all这是返回插座

int sock = socket(nmspace,style,protocol);       
int ret; 
struct hostent *hinfo;            
if(sock<0){ 
    printf("Error occurred while creating socket:%d\n",sock); 
    printf("%s\n",strerror(errno)); 
    return -1; 
} 
memset(&dest, 0, sizeof(struct sockaddr_in));      
hinfo = gethostbyname(rmserver); 
if(hinfo == NULL) 
    printf("getbyname failed!\n"); 
dest.sin_family = AF_INET;           
dest.sin_addr = *(struct in_addr *)(hinfo->h_addr);    
dest.sin_port = htons(port);           
ret = connect(sock, (struct sockaddr *)&dest, sizeof(struct sockaddr)); 
if(ret<0){ 
    printf("Error occurred while connecting on the socket:%d\n",sock); 
    printf("%s\n",strerror(errno)); 
    close(sock); 
    return -1; 
} 

服务器 使得服务器套接字函数里面......这一切是返回套接字函数内部>> >>>>

struct sockaddr_in serv;  
int mysocket,r; 
mysocket = socket(AF_INET, SOCK_STREAM, 0); 
memset(&serv, 0, sizeof(struct sockaddr_in)); 
serv.sin_family = AF_INET;      
serv.sin_addr.s_addr = INADDR_ANY;    
serv.sin_port = htons(port);     
r = bind(mysocket, (struct sockaddr *)&serv, sizeof(struct sockaddr)); 
if(r<0) { 
    printf("Error occurred binding the socket:%d to the server port:%d\n",mysocket,port); 
    printf("%s",strerror(errno)); 
    close(mysocket); 
    return -1; 
} 
r = listen(mysocket, 5);    
if(r<0) { 
    printf("Error occurred while enabling listen on the socket:%d\n",mysocket); 
    printf("%s",strerror(errno)); 
    close(mysocket); 
    return -1; 
} 

服务器接受电话>>>>>>

struct sockaddr_in dest;    
int socksize=sizeof(struct sockaddr_in); 
int consocket; 
consocket = accept(sock, (struct sockaddr *)&dest, (socklen_t *)&socksize); 
if(consocket<0) { 
    printf("Error occurred while accepting on the socket:%d\n",sock); 
    printf("%s\n",strerror(errno)); 
} 

不使用select。我希望我们不需要,因为套接字默认是阻塞的。

欢呼声......拉曼

+0

你能发表任何代码吗?你在使用'select'吗? – Jeff 2011-04-01 05:50:05

+0

为您的评论添加了一些代码 – footloose 2011-04-01 16:22:15

回答

0

您的客户端应该使用connectman page),而不是accept。服务器使用accept来接受传入连接并获取该连接唯一的新套接字,从而使原始文件描述符可用于侦听和接受新连接。连接完成后,客户端只使用同一个套接字。

此外,我建议看看如何使用selectman page)。

+0

我的不好,我复制了错误的代码。请在上面找到正确的代码。另外,我想避免选择,因为我相信它会减慢整个系统。纠正我,如果我错了,但我也会尽快尝试。 – footloose 2011-04-01 17:39:14

+0

@ footloose我不会立即看到任何错误。 'select'是一个额外的函数调用,但其开销应该是最小的。好的是,它应该给你一个关于你正在监听的套接字是否准备好“接受”连接的指示器。如果它已经准备好并且你的“接受”阻止,那就缩小了问题的范围。 – Jeff 2011-04-01 22:34:55