【问题标题】:C bind to a specified TCP portC绑定到指定的TCP端口
【发布时间】:2013-05-19 01:31:20
【问题描述】:

我用 C 创建了一个 Linux 网络应用程序,它有点工作

除了每次我运行它时,它都会绑定到一个新的随机端口

//Create Socket
int socket_desc;
socket_desc=socket(AF_INET,SOCK_STREAM,0);
if (socket_desc==-1)
  perror("Create socket");
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
//Port defined Here:
address.sin_port=htons(81);
//Bind
bind(socket_desc,(struct sockaddr *)&address,sizeof(address));
listen(socket_desc,32);
//Do other stuff (includes accepting connections)

你可以看到我已经指定了端口,但它仍然选择一个免费的随机端口

感谢任何帮助或链接到一个很好的教程

【问题讨论】:

  • 非root用户无法绑定1024下的端口,你的绑定可能失败,你没有检查。试试strace
  • 你试过给一个不大于 1024 的端口吗?试试吧。它会工作的
  • 总是总是 总是检查可能失败的函数的返回值。您使用的所有系统调用都将在失败时返回-1。然后您可以检查errno 错误是什么,并使用例如strerror 获取错误的可打印字符串,或使用perror 直接打印出来。
  • if (bind(...) == -1) ERROR
  • 您已经为socket 通话做到了。继续为其他功能做这件事。我还建议您查看功能手册页。可以找到一组在线手册页here

标签: c networking port bind


【解决方案1】:

这种行为有两个原因(当您指定端口,但系统将套接字绑定到随机端口时):

  1. 如果您要求低于 1024 的端口。这当然是您的情况
  2. 如果您忘记使用htons() 功能。在这种情况下,端口号字节的使用顺序错误,导致 #1。

【讨论】:

    【解决方案2】:

    您需要使用大于 1024 的端口号。小于 1024 的端口号是保留端口,供标准服务使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 2010-09-25
      • 1970-01-01
      • 2021-11-15
      • 2018-12-04
      • 1970-01-01
      相关资源
      最近更新 更多