2015-11-24 4 views
0

Создание клиента tcp < -> серверная программа в c для моего домашнего экзамена. Были проблемы с рецензированием и отправкой данных между сервером и клиентом. Я могу получить только один байт, если я отправлю «abcd», я получаю «a».Получение только одного байта с recv()

(Это происходит в обоих направлениях, так как я использую те же методы для сервера и клиента)

не знаю, если это отправка часть вот проблемы или получения

Это мой код:

#define BUFFER_SIZE 1024 

char* recived_message; 

int send_data(int socket, char* data){ 
    int offset = 0, len = strlen(data); 

    while (offset != len) { 
     int nb = send(socket, data + offset, len - offset, 0); 

     if (nb < 0){ 
      perror("send"); 
      return -1; 
     } 
     offset += nb; 
    } 

    return 0; 
} 

int recive(int socket){ 
    int offset = 0; 

    recived_message = malloc(BUFFER_SIZE); 
    memset(recived_message, 0, BUFFER_SIZE); 

    while (offset != BUFFER_SIZE) { 
     int nb = recv(socket, received_message + offset, BUFFER_SIZE - offset, 0); 

     if(nb == -1){ 
      perror("read"); 
      return -1; 

     }else if(nb == 0){ 
      return -1; 
     } 

     offset += nb; 
    } 

    printf("%d\n", offset); 

    return 0; 
} 

char* get_data(){ 
    return recived_message; 
} 

стороне сервера

int recive_data(int socket){ 
    char* buffer; 

    if(recive(socket) != 0){ 
     return -1; 
    } 

    *buffer = *get_data(); 

    printf("socket %d: %s\nlength: %lu%", fd, buffer, strlen(buffer)); 

    return 0; 
} 

Часть клиента

char* test = "abcd"; 

for(i=0; i<10; i++) { 
    send_data(sock, test); 
    sleep(1); 
} 
+1

Вы правильно получать в цикле, что хорошо, но каждый раз, когда вы итерации в цикле вы перезапишет предыдущие данные в буфере. Вы делаете это правильно, отправляя, почему бы не получить? –

+0

Что касается проблемы, возникшей у вас, пожалуйста, покажите нам, как вы * используете * этот код? Как игрушка знает, что вы получаете только один байт? Как вы это проверяете? И попробуйте отправить что-то, где каждый персонаж уникален, сейчас невозможно сказать, является ли это первым или последним персонажем, который вы видите. О, и вы уверены, что проблема связана с получением, а не с отправкой? –

+0

Ваша посылка (по крайней мере) неверна, вы передаете буфер длиной 5 байтов '' abcd "', но попытаетесь отправить байты BUFFER_SIZE (1024) ... Как вы уверены, что получаете только один байт? –

ответ

1

Проблема здесь

*buffer = *get_data(); 

Вы разыменовываете указатель, возвращаемый get_data() получить только первый указатель элемента к указателю.

И это хуже, потому что вы разыскиваете неинициализированную переменную buffer, чтобы написать этот единственный символ. Это приведет к undefined поведение. Кроме того, более поздние вызовы функций с использованием этой неинициализированной переменной также приводят к неопределенному поведению.

Простое решение (почти) все ваши проблемы: Назначают к фактической переменной:

buffer = get_data(); 

И я говорю, что вышеуказанная решает почти все ваши проблемы, потому что, если прекращение нуля строка не передается? Это также приведет к UB (Undefined Behavior). Если данные, которые вы получаете всегда является строкой, то вы должны убедиться, что он завершается, предпочтительно в функции receive:

int recive(int socket){ 
    ... 
    received_message[offset] = '\0'; 
    return 0; 
} 
+0

Работал! : D унизительная ошибка :( – Murillio4

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