Я пытаюсь изучить программирование сокетов на C, и я пытался установить базовое TCP-соединение между клиентом и сервером, однако в моем server.c мой код, похоже, просто застрял в Listen(). Он не выполняет следующие строки и не возвращает сообщение об ошибке.
#include<stdio.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>
int main(){
char *ip = "127.0.0.1";
int port =5566;
int server_sock,client_sock;
struct sockaddr_in serveraddr,clientaddr;
socklen_t addr_size;
char buffer[1024];
int n;
server_sock=socket(AF_INET,SOCK_STREAM,0);
if (server_sock<0){
perror("[-]Socket error");
exit(1);
}
printf("[+] TCP server socket created\n");
memset(&serveraddr,'\0',sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=port;
serveraddr.sin_addr.s_addr=inet_addr(ip);
n=bind(server_sock,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
if (n<0){
perror("[-]Bind error");
exit(1);
}
printf("[+] TCP SOCKET BOUND to port %d\n",port);
n=listen(server_sock,5);
if (n<0){
perror("listen error\n");exit(1);
}
printf("server listening");
while(1){
addr_size=sizeof(clientaddr);
client_sock=accept(server_sock,(struct sockaddr*) &clientaddr,&addr_size);
printf("[+]Client Connected.\n");
}
}
Это мой текущий server.c
n=listen(server_sock,5);
Дальше этой строки он не выполняется. В моем client.c код аналогичен, однако я получаю ошибку привязки
Ваш поток stdout
, вероятно, по умолчанию установлен в режим строковой буферизации, поэтому он ожидает, что в поток будет записана новая строка, прежде чем он сбросит содержимое буфера в базовый файловый дескриптор. Добавление вызовов fflush(stdout);
приведет к принудительному сбросу буферизованного содержимого в базовый файловый дескриптор.
Когда ваша программа сообщает об ошибке привязки, она сразу же завершает работу. Я не понимаю, как он мог одновременно сообщить об ошибке привязки и выполнить вызов listen()
за один и тот же запуск.
Кстати, ты не правильно настраиваешь порт.
serveraddr.sin_port=port;
-> serveraddr.sin_port=htons(port);
Кроме того, ваш цикл должен вызвать close(client_sock);
, если accept()
успешен.
«Мой код, по-видимому, просто застрял в функции Listen()» Это иллюзия. Это не. Убедитесь, что в конце каждого сообщения, которое вы печатаете и запускаете снова, есть новая строка (\n).
– Комментарий от Н. м. может быть ИИ
Он прав
однако я получаю ошибку привязки. Покажите фактическое сообщение и код, вызывающий ошибку.