【问题标题】:Why bind function is returning -1为什么绑定函数返回-1
【发布时间】:2021-01-29 07:04:34
【问题描述】:

所以我正在关注 UNIX 网络编程这本书,并尝试从第 1 章和客户端编写一个简单的日间服务器,但绑定函数总是返回错误,我做错了什么谁能帮忙??

server.c

/*
 * Daytime Server
*/

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

void printError(char *str)
{
    printf("%s", str);
    exit(0);
}

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

    if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printError("Error at line 32 socket fuct.");
    }

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

    if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        printError("Error at bind function");
    }
    

    if (listen(listenfd, 1024) < 0)
    {
        printError("Error at listen fuct.");
    }

    while (1)
    {
        if ((connfd = accept(listenfd, (struct sockaddr *)NULL, NULL)) < 0)
        {
            printError("Error at accept fuct.");
        }

        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));

        if (write(connfd, buff, strlen(buff)) < 0)
        {
            printError("Error at write fuct.");
        }

        close(connfd);
    }

    return EXIT_SUCCESS;
}

client.c

/*
 * Daytime Client
*/

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

void printError(char *str)
{
    printf("%s", str);
    exit(0);
}

int main(int argc, char **argv)
{
    int socketfd, n;
    char recvline[4097];
    struct sockaddr_in servaddr;

    if (argc != 2)
    {
        printError("Requires ip address of the server");
    }

    if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printError("Unable to create a Connection");
    }

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_port = htons(13);
    servaddr.sin_family = AF_INET;

    if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
    {
        printError("Not valid IP");
    }

    if (connect(socketfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        printError("Connection Error");
    }

    while ((n = read(socketfd, recvline, 4096)) > 0)
    {
        recvline[n] = 0;
        if (fputs(recvline, stdout) == EOF)
        {
            printError("Fputs Error");
        }
    }

    if (n < 0)
    {
        printError("Not readable");
    }

    return EXIT_SUCCESS;
}

正在运行的服务器总是在绑定函数上返回 -1。并且运行客户端总是打印connection error

提前感谢您的帮助。

【问题讨论】:

  • 1024以下的端口号通常需要root权限。尝试 >= 1024。
  • 感谢您的帮助,是的,将perror 打印在控制台中的Permission denied,因此将端口更改为> 1024 或使用sudo 运行都可以。
  • Beej's Guide to Network Programming 是一个很好的(最新的)基本网络参考。 getaddrinfo() 已经取代了 IPv4 和 IPv6 的大量手动连接设置。
  • @DavidC.Rankin "getaddrinfo() 已经取代了许多 IPv4 和 IPv6 的手动连接设置" - 虽然这是真的,但它并不适用于这个问题,不会有任何区别。
  • 同意@RemyLebeau,这就是为什么它在评论中被指出而不是答案的一部分。

标签: c sockets


【解决方案1】:

您应该检查errno 以了解为什么bind() 在返回-1 时会失败。您可以使用perror()errno 的人类可读描述打印到控制台,或者至少使用strerror() 在字符串缓冲区中获取该描述,然后您可以做任何您想做的事情。

但 WHY bind() 失败的最可能原因是您试图将服务器 bind() 连接到端口 13。在大多数系统上,端口 0-1023保留用于系统服务,因此您需要以管理员权限运行您的应用程序才能侦听这些端口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2021-04-11
    • 2017-09-24
    相关资源
    最近更新 更多