Как отправлять структуру через сокеты?

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 флаг поможет читать структуру целиком, но не гарантирует этого - нужны дополнительные проверки.

Мусор в конце потому, что переменная не инициированна.

→ Ссылка