Создание клиента 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);
}
Вы правильно получать в цикле, что хорошо, но каждый раз, когда вы итерации в цикле вы перезапишет предыдущие данные в буфере. Вы делаете это правильно, отправляя, почему бы не получить? –
Что касается проблемы, возникшей у вас, пожалуйста, покажите нам, как вы * используете * этот код? Как игрушка знает, что вы получаете только один байт? Как вы это проверяете? И попробуйте отправить что-то, где каждый персонаж уникален, сейчас невозможно сказать, является ли это первым или последним персонажем, который вы видите. О, и вы уверены, что проблема связана с получением, а не с отправкой? –
Ваша посылка (по крайней мере) неверна, вы передаете буфер длиной 5 байтов '' abcd "', но попытаетесь отправить байты BUFFER_SIZE (1024) ... Как вы уверены, что получаете только один байт? –