Как отправлять структуру через сокеты?
Cервер:
typedef struct send_data
{
char a[50];
char b[50];
char c[50];
}send_data;
send_data sd;
while(recv(sock,&sd,sizeof(sd),0))
{
printf("sd:%s\n",sd.a );
}
Клиент:
send_data sd;
strcpy(sd.a,"Hello");
strcpy(sd.b,"");
send(sock,(void*)&sd,sizeof(sd),0);
Почему-то когда я один раз отправляю структуру sd серверу, на сервере три раза срабатывает recv, в итоге выводится это:
sd:Hello
sd:
sd:�:Q6�U
Почему так происходит и как это исправить?
Вот так запускаю слушающий сокет на сервере:
struct sockaddr_in client;
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(ip);
main_sock = socket(AF_INET,SOCK_STREAM,0);
bind(socket,(struct sockaddr*)&addr,sizeof(addr));
listen(main_sock,10);
client_sock=accept(main_sock,(struct sockaddr*)&client,(int*)&size_client)
Ответы (1 шт):
Автор решения: eri
→ Ссылка
C сокет выдает данные по мере поступления. Интересно конечно почему происходит flush по \0. Это скорее воспринимается как конец сообщения. Добавьте в вопрос как запускаете сокет - попробуем повторить.
MSG_WAITALL для recv флаг поможет читать структуру целиком, но не гарантирует этого - нужны дополнительные проверки.
Мусор в конце потому, что переменная не инициированна.