2014-03-02 49 views
0

一切編譯沒有錯誤和警告。我開始這個程序。我訪問本地主機:8080和程序停止 - 太好了。我試圖再次運行該程序,我得到錯誤:無法綁定消息。 爲什麼?C服務器套接字 - 綁定()錯誤

代碼:

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 

#include <errno.h> 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define PORT 8080 
#define PROTOCOL 0 
#define BACKLOG 10 

int main() 
{ 
    int fd; 
    int connfd; 

    struct sockaddr_in addr; // For bind() 
    struct sockaddr_in cliaddr; // For accept() 
    socklen_t cliaddrlen = sizeof(cliaddr); 

    // Open a socket 
    fd = socket(AF_INET, SOCK_STREAM, PROTOCOL); 
    if (fd == -1) { 
    printf("Error: unable to open a socket\n"); 
    exit(1); 
    } 

    // Create an address 
    //memset(&addr, 0, sizeof addr); 
    addr.sin_addr.s_addr = INADDR_ANY; 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(PORT); 

    if ((bind(fd, (struct sockaddr *)&addr, sizeof(addr))) == -1) { 
    printf("Error: unable to bind\n"); 
    printf("Error code: %d\n", errno); 
    exit(1); 
    } 

    // List for connections 
    if ((listen(fd, BACKLOG)) == -1) { 
    printf("Error: unable to listen for connections\n"); 
    printf("Error code: %d\n", errno); 
    exit(1); 
    } 

    // Accept connections 
    connfd = accept(fd, (struct sockaddr *) &cliaddr, &cliaddrlen); 
    if (connfd == -1) { 
    printf("Error: unable to accept connections\n"); 
    printf("Error code: %d\n", errno); 
    exit(1); 
    } 

    //read(connfd, buffer, bufferlen); 
    //write(connfd, data, datalen); 
    // close(connfd); 

    return 0; 
} 
+1

'的printf( 「錯誤代碼:%d \ n」 個,錯誤號);'(或使用PERROR或字符串錯誤())順便說一句:第一個printf()大概可以復位錯誤號。 BTW2:診斷輸出應該轉到stderr。 – wildplasser

+0

whoopsie!謝謝@wildplasser – chuckfinley

+0

第二次得到的錯誤可能是「EADDRINUSE地址已被使用」? – wildplasser

回答

2

爲了找出原因,你需要打印錯誤;最可能的原因是另一個程序已經在使用該端口(netstat可以告訴你)。

您的打印問題是C格式字符串使用%而不是&。替換你的打印字符串中的字符,它應該工作。

0

首先,看看到了下面的例子: Socket Server Example

二:爲什麼第二次綁定失敗的,因爲你的應用程序崩潰,插座仍難免爲一些秒鐘甚至幾分鐘的原因。

如果連接仍處於打開狀態,請使用「netstat」命令進行檢查。

3

調用bind()之前使用SO_REUSEADDR套接字選項,如果你有在TIME_WAITCLOSE_WAIT狀態舊的連接。

Uses of SO_REUSEADDR?