绑定服务器套接字到端口失败(C)

时间:2015-03-28 03:13:19

标签: c sockets bind

我的代码将始终处理"绑定失败"错误,我不知道为什么。我已多次阅读该手册页,但我无法发现代码有任何问题,有人可以引导我朝正确的方向前进吗?

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

    #define PORT 3490
    #define BACKLOG 10

    int main()
    {
        struct sockaddr_in server;
        struct sockaddr_in dest;
        int status,socket_fd, client_fd,num;
        socklen_t size;

        char buffer[10241];
        char *buff;
    //  memset(buffer,0,sizeof(buffer));
        int yes =1;



        if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0))== -1) {
            fprintf(stderr, "Socket failure!!\n");
            exit(1);
        }

        if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
            perror("setsockopt");
            exit(1);
        }
        memset(&server, 0, sizeof(server));
        memset(&dest,0,sizeof(dest));
        server.sin_family = AF_INET;
        server.sin_port = htons(PORT);
        server.sin_addr.s_addr = INADDR_ANY; 
        if ((bind(socket_fd, (struct sockaddr *)&server, sizeof(struct sockaddr )))== -1)    { //sizeof(struct sockaddr) 
            fprintf(stderr, "Binding Failure\n");


      exit(1);
//other irrelevant code starts here

2 个答案:

答案 0 :(得分:2)

如果netstat -an|grep 3490确实显示127.0.0.1,则在端口上侦听另一个进程,绑定到127.0.0.1而不是INADDR_ANY,这就是SO_REUSEADDR不起作用的原因。但是在你接受我的建议之前,你永远不会知道。

答案 1 :(得分:0)

使用perror之后,我发现地址已被取消,我切换到另一个端口,它工作正常!