0

環境: os: centos サーバー: 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 を何度も再送信することがわかります。なぜ?

4

1 に答える 1

0

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

Apache 2.1.5 は TCP_DEFER_ACCEPT のデフォルトを使用するためです。

于 2013-03-15T05:39:20.557 に答える