Socket API: ошибка связывания: операция с сокетом не на сокете - PullRequest
0 голосов
/ 05 октября 2019

Я новичок в 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);
    }
}

Wrappers 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 Ответ

2 голосов
/ 05 октября 2019

Вы стираете дескриптор сокета, который вы только что создали с помощью

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

, поэтому вам следует удалить его. Я думаю, что вы на самом деле хотели сделать, это

memset(&servaddr, 0, sizeof(servaddr));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...