C 错误端口上的Linux套接字绑定
代码如下:C 错误端口上的Linux套接字绑定,c,linux,sockets,C,Linux,Sockets,代码如下: int main(int argc, char **argv) { int listener_socket, new_socket; struct sockaddr_in server_address; pthread_t player_queue_processing; pthread_attr_t attr; Network_Code wait_message = WAIT; Network_Code incoming_messag
int main(int argc, char **argv)
{
int listener_socket, new_socket;
struct sockaddr_in server_address;
pthread_t player_queue_processing;
pthread_attr_t attr;
Network_Code wait_message = WAIT;
Network_Code incoming_message;
if(pthread_attr_init(&attr) != 0){
perror("Error initializing thread attributes");
return 1;
}
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if(pthread_create(&player_queue_processing, &attr, run, NULL) != 0){
perror("Error creating thread");
return 1;
}
if((listener_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("Error creating socket");
return 1;
}
if((player_queue = qu_allocate()) == NULL){
perror("Error creating player queue");
return 1;
}
memset(&server_address, 0, sizeof server_address);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_port = htons(449);
printf("Listening on port: %d\n", ntohs(server_address.sin_port));
bind(listener_socket, (struct sockaddr*)&server_address, sizeof server_address);
if(listen(listener_socket, BACKLOG) == -1){
perror("Listen");
return 1;
}
while(1){
new_socket = accept(listener_socket, (struct sockaddr*)NULL, NULL);
read(new_socket, &incoming_message, sizeof incoming_message);
if(incoming_message != I_WANT_TO_PLAY){
close(new_socket);
continue;
}
write(new_socket, &wait_message, sizeof wait_message);
if(qu_enqueue(player_queue, (void *)(size_t)new_socket) == QU_ERROR)
perror("Error enqueuing player");
}
}
以及netstat-tulpn所报告的内容
tcp 0 0 0.0.0.0:48577 0.0.0.0:* LISTEN
当客户端使用端口48577时,它可以工作。问题是,即使我正在调用htons()
,服务器绑定到错误的端口。为什么会这样
每次端口更改时,我都重新启动了多次。我正在运行Debian GNU/Linux jessie/sid 64位显示所有相关代码。您必须将sin_端口更改到其他地方,可能是零,或者您正在绑定到另一个结构。449和48577与htons()无关。在向我们展示所有代码之前,请删除所有与问题无关的位。请给我们一个简短完整的程序来演示错误。有关详细信息,请参阅或。您没有检查bind()的结果。这样做,并报告您遇到的错误。您还需要注意read()返回的值。这里没有错误检查,也没有流结束检查,并且您假设它已填充缓冲区。@EJP您是对的错误被拒绝了权限,因此您需要使用一个大于1024的端口,或者以root用户身份运行,但是端口449仍然是保留的,所以不要使用它。