2014-03-02 23 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?