2014-02-11 2 views
0

Добрый день.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)); 

Say я напечатать все следы с: fprintf (STDERR, ""); Таким образом, потеря фокуса терминала из-за разветвления не должна быть проблемой.

Прощай, спасибо!

ответ

0

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

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

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

О, и я предположим, что вы проверяете наличие ошибок в вашем фактическом коде?

Смежные вопросы