Программа сокета локального хост-сервера не работает
У меня есть серверные и клиентские программы сокетов, написанные на C. Я хочу соединить клиентскую программу с серверной программой на моем ноутбуке, используя local host ipaddress 127.0.0.1
, Когда я выполняю серверную программу. его вывод не удалось связать и останавливается. Как сделать так, чтобы клиент подключался к серверу на том же ноутбуке, т.е. через локальный хост. Пожалуйста помоги.
Вот код сервера (это программа сервера эха):
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
main(int argc, char *argv[])
{
int clilen, sockfd, newsockfd, n, cpid;
char msg[100];
struct sockaddr_in serv_addr, cli;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("socket failed to establish\n");
exit(0);
}
printf("socket created\n");
bzero((char *)&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("binding failed\n");
exit(0);
}
printf("binding established\n");
if (listen(sockfd, 5) < 0)
{
printf("not listening\n");
exit(0);
}
printf("listening|n");
for (;;)
{
clilen = sizeof(cli);
if ((newsockfd = accept(sockfd, (struct sockaddr *)&cli, &clilen)) < 0)
{
printf("accept failed\n");
exit(0);
}
printf("accepted\n");
cpid = fork();
if (cpid == 0)
{
n = read(newsockfd, msg, 80);
msg[n] = '\0';
write(newsockfd, msg, strlen(msg));
close(newsockfd);
exit(0);
}
}
}
2 ответа
Я считаю, что проблема произошла, потому что вы передали неправильные значения через командную строку.
Следующая строка кода может работать не так, как вы ожидаете,
serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
Пожалуйста, измените его на
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
Также добавьте эту проверку, чтобы проверить номер порта,
unsigned int port;
if ( argc < 2 )
{
port = Some_Port_No;
}
else
{
port=atoi(argv[2]);
}
И изменить
serv_addr.sin_port=htons(atoi(argv[2]));
в
servaddr.sin_port = htons(port);
Поэтому, как правило, когда сервер написан, вы просто привязываете его к любому адресу, а не к одному конкретному. Важным является номер порта, который слушает сервер. Когда вы говорите клиенту подключиться к локальному хосту, вы также передаете ему номер порта, который прослушивает сервер, чтобы вы могли установить соединение.
Попробуйте изменить это:
serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
к этому:
serv_addr.sin_addr.s_addr=INADDR_ANY;
Вот ссылка, которая может вам очень помочь: http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html