2012-04-08 3 views
2

Я начинаю заниматься программированием сокетов, и у меня возникает проблема при отправке данных через сокет с использованием другого размера буфера для отправителя и получателя. Мне нужно сделать 2 основных программы, говорящего и слушателя. Нужно отправить все, что было передано в stdin, отправить его по сокету, и ресивер должен распечатать данные. Проблема заключается в том, что при использовании различного размера буфера для отправителя и получателя данные, которые печатаются приемником, являются неполными или неработоспособными. Я не понимаю, почему?проблема при отправке и в буферном буфере различны

Вот наиболее актуальные кусок кода:

СЛУШАТЕЛЬ:

#define BUFFERSIZE 20 

... 

while((numbytes = recv(new_fd, buf, BUFFERSIZE - 1, 0)) > 0) { 
    buf[numbytes] = 0; 
    printf("%s", buf); 
} 
perror("recv"); 

Говорун:

#define BUFFERSIZE 10 

...

while(fgets(buffer, BUFFERSIZE , stdin) != NULL) 
{ 
    printf("%s", buffer); 
    if ((numbytes = send(sockfd, buffer, sizeof buffer, 0)) == -1) { 
     perror("talker: sendto"); 
     exit(1); 
    } 
    printf("\n"); 
} 

Например, с этим файл теста:

abcdefghijklmnopqrstuvwxyz 
abcdefghijklmnopqrstuvwxyz 
abcdefghijklmnopqrstuvwxyz 
abcdefghijklmnopqrstuvwxyz 
abcdefghijklmnopqrstuvwxyz 

будут печататься

➜ ./listener           
abcdefghijklmnopqrabcdefghiiz 
recv: Success 
abcdefghijklmnopqrr  

Что это такое, что я делаю неправильно?

Спасибо за вашу работу!

+1

Какова ценность MAXBUFLEN? –

+0

это была ошибка: она должна была быть BUFFERSIZE. спасибо :) –

ответ

2

Поскольку вы передаете только строки, вы не всегда должны отправлять полный буфер, а только «длину строки», то есть используйте strlen(buffer) вместо sizeof buffer. Тогда странное поведение должно исчезнуть.

if ((numbytes = send(sockfd, buffer, strlen(buffer), 0)) == -1) { 
... 
+0

приятно. странное поведение теперь исчезло! –

+0

большое спасибо! вы понимаете странное поведение? –

+0

Вы всегда передаете полный буфер, не устанавливая его на ноль между ними. Странное поведение может быть вызвано, например, некоторыми остатками артефактов в буфере. Вы можете попробовать вставить 'bzero (buffer, BUFFERSIZE);' после 'send()'. Это также должно устранить странное поведение. – diewie