C绑定到指定的TCP端口

C绑定到指定的TCP端口,c,networking,port,bind,C,Networking,Port,Bind,我已经用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_ad

我已经用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)
正如您所看到的,我已经指定了端口,但它仍然选择了一个自由随机端口

//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)

如果您需要使用大于1024的端口号,请提供有关此问题的帮助或链接,我们将不胜感激。小于1024的端口号是保留端口,由标准服务使用。

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

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

  • 非root用户无法绑定1024以下的端口,您的绑定可能会失败,并且您没有进行检查。尝试
    strace
    it您是否尝试过将端口设置为不大于1024?试试看。它将始终检查可能失败的函数的返回值。失败时,您使用的所有系统调用将返回
    -1
    。然后,您可以检查错误是什么,并使用例如获取错误的可打印字符串,或使用直接打印出来。
    if(bind(…)==-1)error
    您已经为
    套接字调用执行了该操作。继续做其他的功能。另外,我建议您查看功能手册页面。可以找到一组在线手册页面。