2017-07-07 5 views
0

私はLinuxでソケットプログラミングを学んでいますが、問題があります。CでのLinuxソケットプログラミング、サーバソケットが閉じられない

本当にシンプルなクライアントとサーバーのソケット接続をTCPソケットで設定しようとしています。しかし、サーバーを再起動すると、同じIPアドレスとポート番号にバインドできないため、サーバーソケットを閉じることができないと思います。

問題のデバッグ方法もわかりません。私はbindのマニュアルページでエラーが発生したときにerrnoが設定されると読んでいます。私はそれを見る方法を知らない。errno

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

は、私の知る限り理解し、ファイルディスクリプタであるソケットは、すぐに閉じて取得することはできません。

は、ここに私のすべてのコードです。したがって、プログラムが終了して30秒以内に再度実行されると、アドレスにバインドできません。しかし、私が待っていれば、分のように、それはアドレスに束縛することに問題はありません。

この問題の原因を教えてください。

+1

あなたはhttps://stackoverflow.com/a/15199016/1034749を読んでいますか? – fghj

+0

はい、私は今それをチェックしました。それが私の考えです。 – Bora

答えて

0

perror()を使用して、読み取り可能なエラーメッセージを表示し、serverSocketを再利用可能に設定することができます。スニペットは次のとおりです。

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); 
} 
関連する問題