【问题标题】:bind is not working in my C program [closed]绑定在我的 C 程序中不起作用[关闭]
【发布时间】:2015-07-25 19:34:02
【问题描述】:

这是我编写的用于创建套接字并将其绑定到地址和端口的代码:

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <strings.h>
#include <netdb.h>

int main(int argc, char *argv[])
{
    const char APPRESSMESSAGE[] = "APRESS,For Profesionals By Professional!\n";
    int SimpleSocket = 0;
    int SimplePort = 0;
    if (argc != 2)
    {
        fprintf(stderr, "USAGE: %s <port>\n", argv[0]);
        exit(1);
    }
    SimpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (SimpleSocket == -1)
    {
        fprintf(stderr, "Could not create the socket !\n");
        exit(2);
    }
    else
    {
        fprintf(stdout, "socket created\n");
    }
    SimplePort = atoi(argv[1]);
    struct sockaddr_in SimpleServer;
    bzero(&SimpleServer, sizeof(SimpleServer));
    SimpleServer.sin_family = AF_INET;
    SimpleServer.sin_addr.s_addr = htonl(INADDR_ANY);
    SimpleServer.sin_port = htons(SimplePort);
    int return_status;
    return_status = bind(SimpleSocket, (struct sockaddr *)&SimpleServer, sizeof(SimpleServer));
    if (return_status == 0)
    {
        fprintf(stdout, "bind completed\n");
    }
    else
    {
        fprintf(stderr, "could not bind to socket\n");
        close(SimpleSocket);
        exit(1);
    }
    return 0;
}

在这里,我期望输出是:

socket created
bind completed.

但结果是“无法绑定到套接字”。 这可能是什么原因?

【问题讨论】:

  • 您查看过bind 的文档吗?它对返回状态和错误有什么说明?
  • 成功时返回零。
  • 好吧,失败时,errno 是什么?
  • 如果不是0,检查errno找出失败的原因。如果没有 errno,我们就有数百种可能性。很可能是您想要的端口已被占用。另一种可能性是 atoi 无法转换的错误输入导致您尝试绑定端口 0。首选 strtol 而不是 atoi,因为 strtol 会在转换失败时告诉您。
  • 另外,你的缩进是错误的......“不是最佳的”,这使得代码难以遵循:(。

标签: c linux sockets networking


【解决方案1】:

结果是“无法绑定到套接字”。这可能是什么原因?

引用man bind(在Linux系统上),一些可能的错误(Unix套接字还有更多,但这是一个TCP套接字):

错误
    EACCES 地址受保护,用户不是超级用户。

    EADDRINUSE
           给定的地址已被使用。

    EBADF sockfd 不是有效的描述符。

    EINVAL 套接字已经绑定到一个地址。

    ENOTSOCK
           sockfd 是文件的描述符,而不是套接字。

您可以通过检查errno 的值或简单地调用perror 来显着减少调查的可能性:

if (bind(SimpleSocket,(struct sockaddr *)&SimpleServer,sizeof(SimpleServer)) == 0) {
    fprintf(stdout,"bind completed\n");
}
else {
    perror("Could not bind to socket");
    close(SimpleSocket);
    exit(1);
}

【讨论】:

    猜你喜欢
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多