将C绑定到指定的TCP端口

4

我使用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)

您可以看到,我已经指定了端口,但它仍然选择一个可用的随机端口。
如果有任何帮助或链接到一个好的教程,将不胜感激。

6
非root用户无法在1024以下绑定端口,您的绑定可能会失败,而您没有检查。尝试使用strace进行调试。 - Zang MingJie
2
你试过使用大于1024的端口号吗?试一下,它会起作用的。 - shubendrak
5
无论何时 无论何时 无论何时 ,都要检查可能失败的函数的返回值。你使用的所有系统调用在失败时都会返回-1。然后,您可以检查errno来了解错误原因,使用例如 strerror 来获得一个可打印的错误字符串,或者使用 perror 直接打印出来。 - Some programmer dude
1
if (bind(...) == -1) ERROR - Nikolai Fetissov
1
你已经为 socket 调用做到了这一点。只需继续为其他函数做同样的事情即可。此外,我建议您查看函数手册页面。可以在这里找到一组在线手册页面。 - Some programmer dude
显示剩余5条评论
2个回答

2

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


0

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

  1. 如果您请求低于1024的端口。这肯定是您的情况
  2. 如果您忘记使用htons()函数。在这种情况下,端口号的字节顺序使用错误,导致#1。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接