2017-07-07 1 views
0

Ich lerne Socket-Programmierung in Linux und ich habe ein Problem.Linux-Socket-Programmierung in C, Server-Socket kann nicht geschlossen werden

Ich versuche, eine wirklich einfache Client-Server-Socket-Verbindung mit TCP-Sockets einzurichten. Ich glaube jedoch, dass ich den Server-Socket nicht schließen kann, da er beim Neustart des Servers nicht an dieselbe IP-Adresse und Portnummer gebunden werden kann.

Ich weiß auch nicht, wie Debug-Problem. Ich habe gelesen, dass errno gesetzt wird, wenn ein Fehler in man-Seiten von bind auftritt. Ich weiß nicht, wie ich das ansehen soll errno.

Hier ist mein all-Code:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 

int main(int argc, char* argv[]) { 

    int serverSocket, clientSocket, portno; 
    socklen_t clientLength; 
    struct sockaddr_in serverAddress, clientAddress; 
    int n; 
    char buffer[256]; 

    if (argc < 2) { 
     fprintf(stderr, "ERROR too few arguments.\n"); 
     exit(-1); 
    } 

    serverSocket = socket(AF_INET, SOCK_STREAM, 0); 
    if (serverSocket < 0) { 
     fprintf(stderr, "ERROR creating socket!\n"); 
     exit(1); 
    } 

    bzero((char*) &serverAddress, sizeof(serverAddress)); 
    portno = atoi(argv[1]); 

    serverAddress.sin_family = AF_INET; 
    serverAddress.sin_addr.s_addr = INADDR_ANY; 
    serverAddress.sin_port = htons(portno); 

    if (bind(serverSocket, (struct sockaddr*) &serverAddress, sizeof(serverAddress)) < 0) { //This bind will fail, after re-run. 
     fprintf(stderr, "ERROR binding socket\n"); 
     exit(2); 
    } 

    listen(serverSocket, 5); 
    clientLength = sizeof(clientAddress); 

    clientSocket = accept(serverSocket, (struct sockaddr*) &clientSocket, &clientLength); 
    if (clientSocket < 0) { 
     fprintf(stderr, "ERROR on accept\n"); 
     exit(3); 
    } 

    bzero(buffer, 256); 
    n = read(clientSocket, buffer, 256); 
    char* ack = "I got your message"; 
    fprintf(stdout, "Here is the message %s\n", buffer); 

    n = write(clientSocket, ack, strlen(ack)); 

    close(clientSocket); 
    close(serverSocket); 
    return 0; 
} 

Soweit ich verstehe, die Buchse, die ein Dateideskriptor ist, kann nicht sofort geschlossen lassen. Wenn das Programm beendet wird und ich innerhalb von 30 Sekunden erneut laufe, kann es nicht an die Adresse binden. Aber wenn ich auf eine Minute warte, hat es kein Problem, die Adresse zu binden.

Was verursacht dieses Problem?

+1

Haben Sie https://stackoverflow.com/a/15199016/1034749 lesen? – fghj

+0

Ja, ich habe es jetzt überprüft. Das ist meine Lösung, denke ich. – Bora

Antwort

0

Sie können perror() verwenden, um die lesbare Fehlermeldung anzuzeigen, und serverSocket wiederverwendbar festlegen. Das Snippet ist hier aufgelistet:

serverAddress.sin_port = htons(portno); 
int opt = 1; 
setsockopt(serverSocket,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); 
if (bind(serverSocket, (struct sockaddr*) &serverAddress, sizeof(serverAddress)) < 0) { 
    //This bind will fail, after re-run. 
    perror("bind "); 
    fprintf(stderr, "ERROR binding socket\n"); 
    exit(2); 
} 
Verwandte Themen