сокеты — C ++: классическое упражнение общения между сервером и клиентом

Добрый день.

Будучи студентом факультета компьютерных наук, изучая низкоуровневое программирование на Си, я застрял в «классическом» практическом упражнении по написанию программы взаимодействия сервер-клиент.

Цель состоит в том, чтобы разработать серверный компонент, который получает команду от удаленного клиентского компонента и выполняет ее как локальную команду оболочки; затем вывод команды снова отправляется клиенту. Довольно просто

Мой код отправляет команду от клиента, сервер успешно получает ее, выполняет и записывает вывод. Но в этот момент, когда сервер sayd пытается ответить этим выводом клиенту … что-то идет не так, и клиент ничего не получает. Понятия не имею, если проблема в серверной части или в клиентской копии.

Любая идея? Заранее спасибо!

Сервер:

struct sockaddr_in srvaddr, cliaddr;
memset(&srvaddr, 0, sizeof(srvaddr));
memset(&cliaddr, 0, sizeof(cliaddr));

int sk = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

srvaddr.sin_family = AF_INET;
srvaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
srvaddr.sin_port = htons(42000);
bind(sk, (struct sockaddr*)&srvaddr, sizeof(srvaddr));
recvfrom(sk, recepcion, sizeof(recepcion), 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));

// [...] Portion of code with a Pipe pointing to a Fork which runs the command...

// And here is where, maybe, the communication is lost:
sendto(sk, recepcion, sizeof(recepcion), 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));

Клиент:

struct sockaddr_in srvaddr, cliaddr;

memset(&srvaddr, 0, sizeof(srvaddr));
memset(&cliaddr, 0, sizeof(cliaddr));

int sk = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

cliaddr.sin_family = AF_INET;
cliaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
cliaddr.sin_port = htons(42001);

srvaddr.sin_family = AF_INET;
srvaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
srvaddr.sin_port = htons(42000);

// [...] Some other code catching the command from the argument paramenters:

sendto(sk, comando, strlen(comando), 0, (struct sockaddr*)&srvaddr, sizeof(srvaddr));

// And here's where the server reply should be, but theres nothing:
recvfrom(sk, buff, sizeof(buff), 0, (struct sockaddr*)&srvaddr, sizeof(srvaddr));

Скажем, я печатаю все следы с помощью:
fprintf (stderr, «»);
Таким образом, потеря фокуса терминала из-за разветвления не должна быть проблемой.

Пока и спасибо!

0

Решение

Проблема, скорее всего, recvfrom вызов. Если вы проверите страница руководства вы увидите, что длина адреса источника указатель. Я не знаю, как вам удалось собрать его без ошибок или предупреждений.

Вам нужно инициализировать размер к фактическому размеру структуры адреса сокета, передать на него указатель и recvfrom Функция заполнит фактический размер:

socklen_t cliaddrlen = sizeof(cliaddr);
recvfrom(sk, recepcion, sizeof(recepcion), 0,
(struct sockaddr *) &cliaddr, &cliaddrlen);

О, и я предполагаю, что вы проверяете наличие ошибок в вашем реальном коде?

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]