【问题标题】:Bind error in IPv6 serverIPv6 服务器中的绑定错误
【发布时间】:2018-08-19 00:36:48
【问题描述】:

我正在尝试制作 IPv6 服务器,但我遇到了套接字绑定问题。 “无法绑定套接字”

所有代码:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdbool.h>

int main(int argc, char *argv[]) {

    int server_port = 8877;

    struct sockaddr_in6 server_address;
    memset(&server_address, 0, sizeof(server_address));

    server_address.sin6_family = AF_INET6;
    server_address.sin6_port = htons(server_port);
    server_address.sin6_addr = in6addr_any;


    int sockfd;

    if (sockfd = socket(AF_INET6, SOCK_STREAM, 0) < 0) {
        printf("could not create listen socket\n");
        return 1;
    }


    if (bind(sockfd, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
        printf("could not bind socket\n");
        return 1;
    }

    int numberOfClients = 1;


    if (listen(sockfd, numberOfClients) < 0) {
        printf("could not open socket for listening\n");
        return 1;
    }


    struct sockaddr_in client_address;
    int client_len = 0;


    char buff4[INET_ADDRSTRLEN];

    while (1) {


        int sock;
        if ((sock =
                 accept(sock, (struct sockaddr *)&client_address,
                        0)) < 0) {
            printf("could not open a socket to accept data\n");
            return 1;
        }

        //printf("client connected with ip address: %s\n", inet_ntop(AF_INET, &(client_address.sin_addr), buff4, INET_ADDRSTRLEN));



        int n = 0;
        int len = 0, maxlen = 100;
        char buffer[maxlen];
        char *pbuffer = buffer;

        printf("client connected with ip address: %s\n",
               inet_ntoa(client_address.sin_addr));


        while ((n = recv(sock, pbuffer, maxlen, 0)) > 0) {
            pbuffer += n;
            maxlen -= n;
            len += n;

            printf("received: '%s'\n", buffer);

            // echo received content back
            send(sock, buffer, len, 0);
        }

        close(sock);
    }

    close(sockfd);
    return 0;
}

【问题讨论】:

  • 使用perror显示无法绑定socket的原因。我的猜测是该端口已经在使用中,或者您正在尝试绑定到特权端口但没有权限。
  • 你能把错误信息改写成fprintf(stderr, "could not bind to socket: %s", strerror(errno));,这样你就可以看到它失败的原因了吗?还是直接使用perror
  • 这会输出Socket operation on non-socket

标签: c sockets ipv6


【解决方案1】:

这里的问题是你的操作顺序。

你写过:

    if (sockfd = socket(AF_INET6, SOCK_STREAM, 0) < 0) {

您希望这会将socket() 的返回值分配给sockfd。但是,它将返回值与 0 进行比较,该值是否小于 0 是实际存储在 sockfd 中的值。

在比较之前,您应该使用一对额外的括号来明确表示您要进行分配,然后才进行比较:

    if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0) {

更好的是,通过首先分配然后分别比较来使代码更明显,从而使代码更易于维护。

    sockfd = socket(AF_INET6, SOCK_STREAM, 0);
    if (sockfd < 0) {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多