TCP连接上的Solaris 10 64位“Broken Pipe”

时间:2012-04-05 19:06:59

标签: sockets solaris pipe

我创建了一个简单的客户端/服务器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 backtrace在/64/libc.so中显示要从__so_send调用的信号

  • 我尝试过将NON-Blockin,Linger,Reuse,Sleeps设置为Client / Server,但没有任何效果。

  • 我也试过信号(SIGPIPE,SIG_IGN);在客户

这似乎是一个巨大的BUG。

任何帮助/解决方法的人?

1 个答案:

答案 0 :(得分: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; 
 }

为什么我们需要重新制作袜子没有意义,但它有效。 如果有人知道更多,请随意。