套接字API:绑定错误:非套接字上的套接字操作

时间:2019-10-05 05:22:21

标签: c sockets

我是c的新手,我正在尝试学习套接字api,但是出现了以下错误:来自Bind的非套接字上的套接字操作

套接字未给出错误

daytimeserv1.c:

#include "../holds/runp.h"
#include "../holds/wrapper.h"

int main(int argc, char **argv) {
    int listenfd, connfd;
    struct sockaddr_in servaddr;
    char buff[MAXLINE];
    time_t ticks;

    listenfd = Socket(AF_INET, SOCK_STREAM, 0);

    memset(&listenfd, 0, sizeof(listenfd));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(13);

    Bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));

    Listen(listenfd, LISTENQ);

    for( ; ; ) {
        connfd = Accept(listenfd, (struct sockaddr *) NULL, NULL);
        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
        Write(connfd, buff, strlen(buff));

        Close(connfd);
    }
}

包装器wrapper.c

#include "wrapper.h"

void err_sys(const char* x) {
    perror(x);
    exit(1);
}

int Socket(int family, int type, int protocol) {
    int n = socket(family, type, protocol);
    if (n < 0)
        err_sys("socket error");
    return(n);
}

void Bind(int fd, const struct sockaddr *sa, socklen_t salen) {
    if(bind(fd, sa, salen) < 0)
        err_sys("bind error");
}

runp.h只是包含和常量

非常感谢您的帮助!谢谢! (如果有帮助的话,我的构建系统就是bazel)

1 个答案:

答案 0 :(得分:2)

您正在擦除刚通过创建的套接字句柄

memset(&listenfd, 0, sizeof(listenfd));

,因此您应该将其删除。 我想你实际上想做的是

memset(&servaddr, 0, sizeof(servaddr));