为什么我的服务器的套接字是SYN_RECV

时间:2013-03-13 08:55:20

标签: sockets client connect apache

环境:   os:centos   server:apache 2.2.22

问题是服务器无法完成三次握手。 客户端可以接收SYN-ACK数据包和响应ACK,但服务器无法获取。

客户端代码:

int main() {

struct sockaddr_in srvaddr;
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(80);
int32_t sockfd;
srvaddr.sin_addr.s_addr = inet_addr("10.200.33.201");//httpd ip
sockfd = socket(AF_INET,SOCK_STREAM,0);

if(connect(sockfd,(struct sockaddr*) &srvaddr,sizeof(struct sockaddr)) < 0)
  printf("connect error!\n");
//close(sockfd);

pause();
return 0;

}

在执行客户端后,使用'netstat -natp',找到连接套接字是SYN_RECV状态。 如果使用wireshark捕获数据包,我发现客户端多次重新发送ACK。 为什么呢?

1 个答案:

答案 0 :(得分:0)

的#include   int timeout = 1;   setsockopt(listen_fd,IPPROTO_TCP,TCP_DEFER_ACCEPT,&amp; timeout,sizeof(int))

因为apache 2.1.5使用TCP_DEFER_ACCEPT默认值;