2017-06-20 2 views
1

Ich versuche, Server/Client-Kommunikation zu erstellen und es fehlschlägt die Connect-Funktion mit Fehlern 88. Ich überprüft, ob der Socketfd gültig ist (weil dieser Fehler bedeutet, dass ich versuche Socket-Operation auf nicht-Socket-Objekt zu machen).Verbinden mit Socket fehlgeschlagen - Fehlernummer 88 (cpp)

int main (int argc, char *argv[]) 
{ 
// Validity check 
if (argc != VALID_ARG_NUM) { 
    std::cout << INVALID_ARG; 
    return 0; // todo - return 0 is correct?? 
} 

int port; 
struct sockaddr_in server_address; 

// server_address initialization. 
server_address.sin_family = AF_INET; 
server_address.sin_port = htons((uint32_t)atof(argv[3])); 
server_address.sin_addr.s_addr = inet_addr(argv[2]); 
memset(&(server_address.sin_zero), '\0', sizeof(server_address)); 

// Create the client socket. 
if (sockfd = socket(AF_INET, SOCK_STREAM, 0) < 0) { 
    std::cout << "ERROR: socket " << errno << "." << std::endl; 
    exit(1); 
} 
// Connect to server. 
if (connect(sockfd, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) { 
    std::cout << "ERROR: connect " << errno << "." << std::endl; 
    std::cout << CON_FAIL; 
    close(sockfd); 
    exit(1); 
} 
....... 

danke.

+0

Wenn Sie Boost verfügbar haben oder es herunterladen können, würde ich Boost Asio für Socket-Programmierung sehr empfehlen. – Peri461

+0

Die Fehlercodes in 'errno' sind wirklich plattformabhängig. Bitte teilen Sie uns mit, welche Plattform (Betriebssystem) Sie verwenden. Und verwende z.B. 'strarror', um eine druckbare Zeichenfolge aus dem Fehlercode zu erhalten. –

+0

Sorry, das Betriebssystem ist Linux. –

Antwort

1

Der Vorrang der Anweisung

sockfd = socket(AF_INET, SOCK_STREAM, 0) < 0 

ist

sockfd = ((socket(AF_INET, SOCK_STREAM, 0)) < 0) 

und Sie ordnen daher einen booleschen Wert zu, der implizit in eine Ganzzahl (oder einen anderen Typ sockfd) konvertiert wird. Was Sie wahrscheinlich meinten, war stattdessen

(sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 
+0

ok, ich habe es so verändert, wie du es mir gesagt hast, und es blieb immer noch - mit kaputt Pipe .. –

+0

@MichalShalom: Nun, das ist [ein ganz anderes Problem] (https://stackoverflow.com/q/4584904/147845). – You

1

Ich denke, dieser Teil verursacht Pufferüberlauf:

memset(&(server_address.sin_zero), '\0', sizeof(server_address)); 

Sie sollten die ganze Struktur vor dem Schreiben somefields Null:

struct sockaddr_in server_address; 
// server_address initialization. 
memset(&server_address, 0, sizeof(server_address)); 
server_address.sin_family = AF_INET; 
+0

Ich habe es geändert, und immer noch 88:/ –

0

Broken Pipe bedeutet in der Regel, dass Remote-Peer-Verbindung schließt. Sind Sie sicher, dass Ihr Servercode in Ordnung ist? Vielleicht macht es einfach so etwas?

int main() 
{ 
... 
listen(); 
accept(); 

return 0;//procees exits and therefore brakes connection 
} 
Verwandte Themen