2012-04-05 5 views
0

Ich habe eine einfache Client/Server TCP-Verbindung erstellen.Solaris 10 64bit "Broken Pipe" auf TCP-Verbindung

Wenn der Server bereits läuft und der Client nach dem Start startet, funktioniert alles OK.

PROBLEM Wenn Client startet, bevor Server -> Client beendet mit "Broken Pipe"

Code Auftraggeber:

 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-Signal zeigt von __so_send in/64 aufgerufen werden /libc.so

  • Ich habe versucht Einstellung NON-Blockin, Linger, Wiederverwendung, schläft auf Client/Server, aber nichts funktioniert s.

  • Ich habe auch versucht, Signal (SIGPIPE, SIG_IGN); auf dem Client

Dies scheint wie ein riesiger Fehler.

Alle HILFE/Workarounds Leute?

Antwort

0

Es scheint, dass wir die Steckdose löschen und neu erstellen müssen:

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; 
} 

macht keinen Sinn machen, warum wir brauchen, um neu zu erstellen, die Socke, aber es funktioniert. Wenn jemand mehr weiß, bitte fühlen Sie sich frei.