отправка нескольких сокетов send / recv

Мне нужно уточнить бит при использовании нескольких программ сокетов send / recv. Моя клиентская программа выглядит ниже (с использованием TCP SOCK_STREAM).

send(sockfd,"Messgfromlient",15,0); send(sockfd,"cli1",5,0); send(sockfd,"cli2",5,0); send(sockfd,"cli3",5,0); send(sockfd,"cli4",5,0); send(sockfd,"cli5",5,0); 

и программа сервера выглядит ниже.

  recv(newsockfd,buf,20,0); printf("Buffer is %s\n",buf); 

когда я выполняю вышеуказанную программу, вывод выглядит следующим образом:

Клиент Msg: Messgfromlient

Я считаю, что размер buf равен 20, поэтому получает только один буфер. Добавление еще одного recv на стороне сервера.

  char buf[20],buf[20]; ------skipped------ recv(newsockfd,buf,20,0); recv(newsockfd,buf1,20,0); printf("Client Msg :%s\n",buf); printf("Client Msg :%s \n",buf1); 

выход: 1-е испытание:

  Client Msg :Messgfromlient Client Msg :cli2 

Вторая тропа:

  Client Msg :Messgfromlient Client Msg :cli1 

Поскольку мы видим, что в Ouputs есть какое-то противоречие, со стороны клиента все сообщения отправляются, но на сервере msg будет получен на основе размера buf, здесь eventhough buf1 имеет размер 20, почему ‘cli3’ ‘cli4”cli4’ msg не получаются на buf1 ?. Есть ли какой-то конкретный предел? Просьба пояснить это.

Спасибо, Advance, Raja

TCP – это протокол на основе байтов, он ничего не знает о сообщениях. Вы отправляете всего 25 байтов, и каждый recv с другой стороны будет читать некоторые из этих байтов. Вы можете получить 20, вы можете получить 1 а затем 19 в следующем чтении, вы можете получить 5 затем 4 затем 11 затем 5. Параметр размера recv – это максимальное число для чтения.

Вам нужно зациклиться, пока вы не прочитаете все сообщение самостоятельно, а также поймете, что вы можете получить более одного «отправить» в том же полученном сообщении.

программа сервера выглядит ниже.

 recv(newsockfd,buf,20,0); printf("Buffer is %s\n",buf); 

Это уже неправильно. Так должно быть:

 int count = recv(newsockfd,buf,20,0); if (count == -1) { perror("recv"); // please improve this message close(newsocketfd); } else if (count == 0) { // peer has closed the connection close(newsockfd); } else { printf("Buffer is %.*s\n",count,buf); } 

Это должно дать вам достаточно намека …

У вас есть 2 вопроса:

Когда вы показываете результаты, вы остановитесь в первом нулевом байте, который всегда после «Messgfromlient». Может быть получено больше текста, но вы его не показываете.

Вторая проблема заключается в том, что TCP-соединение является streamом. Вы можете получить все данные за один раз, вы можете получить только первый байт. Вы не знаете, какой из них он и не может предсказать. Вам необходимо обрабатывать неполные чтения в вашем приложении, и вам приходится обрабатывать повторные попытки.

Однако вы можете сделать более вероятным, что все данные будут отправлены в одном пакете, а не в 6. Посмотрите на параметр TCP_CORK.