TCP服务器接受调用不返回

TCP服务器接受调用不返回,tcp,connect,Tcp,Connect,我们需要一些关于TCP客户机-服务器代码的帮助。客户端从其connect调用超时,服务器不从accept返回。这是特蕾丝 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, <unfin

我们需要一些关于TCP客户机-服务器代码的帮助。客户端从其connect调用超时,服务器不从accept返回。这是特蕾丝

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
strace-p7167-p7168-p7297
已连接进程7167-中断以退出
已连接进程7168-中断以退出
已连接进程7297-中断以退出
[pid 7167]接受(4,
[pid 7168]接受(4,
[pid 7297]连接(3,{sa_family=AF_INET,sin_port=htons(24465),sin_addr=INET_addr(“215.47.142.168”)),16
我们重新启动了系统,但问题仍然存在,即使是在重新启动之后

这可能是一个SYN洪水问题。我们如何处理此类连接?此外,半成品连接是否在侦听队列(侦听调用的参数2)中排队,并停止来自任何客户端的任何进一步接受,或者TCP是否仅阻止该特定客户端

这是密码。。。 所有这些都在返回套接字的函数中

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;
}
int sock=socket(空间、样式、协议);
int ret;
结构主机*hinfo;
if(sockh_addr);
目的地sin_港=htons(港);
ret=connect(sock,(struct sockaddr*)和dest,sizeof(struct sockaddr));
如果(ret>>>>>>>

服务中的结构sockaddr\u; 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(端口); r=bind(mysocket,(struct sockaddr*)&serv,sizeof(struct sockaddr)); 如果(r>>>>

dest中的结构sockaddr\u; int socksize=sizeof(结构sockaddr_in); int consocket; consocket=accept(sock,(struct sockaddr*)和dest,(socklen\u t*)和socksize);
如果(consocket您的客户应该使用
connect
()而不是
accept
。服务器使用
accept
来接受传入的连接并获取该连接特有的新套接字,保留原始文件描述符用于侦听和接受新连接。客户端在建立连接后只使用同一套接字


另外,我建议大家看看如何使用
select
().

你可以发布任何代码吗?你是否使用了
选择
?为你的评论添加了一些代码。很糟糕,我复制了错误的代码。请找到上面正确的代码。另外,我想避免选择,因为我相信它会减慢整个系统。如果我错了,请纠正我,尽管我也会快速尝试。@footloom我没有立即看到错误任何错误。
select
是一个额外的函数调用,但它的开销应该是最小的。好的是,它应该给你一个指示,告诉你正在监听的套接字是否真的准备好了接受连接。如果它准备好了并且你的
accept
阻塞了,这就缩小了问题的范围。
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));
}