2011-04-01 56 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

相關問題