0

シンプルなクライアント/サーバー TCP 接続を作成しました。

サーバーがすでに実行されていて、クライアントが起動した後、すべてが正常に機能する場合。

問題クライアントがサーバーの前に起動する場合 -> クライアントは「Broken Pipe」で終了します

クライアントコード:

     char *sUceTcpIP="127.0.0.1";
     int  isUceTcpPort=51515;

     struct sockaddr_in dest; 
     memset(&dest, 0, sizeof(dest));
     dest.sin_family = AF_INET;
     dest.sin_addr.s_addr = inet_addr(sUceTcpIP); 
     dest.sin_port = htons(isUceTcpPort);   

     while ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) <= 0) ;
     while (connect(sockfd,(struct sockaddr *) &dest,sizeof(dest)) < 0)
     { sleep(1); }
     strcpy(buffer,"sometext");
     send(sockfd,buffer,strlen(buffer)+1,0); <---- Broken Pipe
  • gdb バックトレースは、/64/libc.so の __so_send から呼び出されるシグナルを示しています

  • NON-Blockin、Linger、Reuse、Sleeps をクライアント/サーバーの両方に設定しようとしましたが、何も機能しません。

  • signal(SIGPIPE,SIG_IGN); も試しました。クライアント上

これは巨大なバグのようです。

ヘルプ/回避策はありますか?

4

1 に答える 1

0

ソケットを削除して再作成する必要があるようです。

connect: 
while ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) <= 0) ;
if (connect(sockfd,(struct sockaddr *) &dest,sizeof(dest)) < 0)
 { 
   close(sockfd); <--- close it
   sleep(1); 
   goto connect; 
 }

靴下を再作成する必要がある理由はわかりませんが、機能します。どなたか詳しい方いらっしゃいましたらよろしくお願いします。

于 2012-04-06T18:58:42.380 に答える