Получение нескольких сообщений Winsock2 C ++ - PullRequest
0 голосов
/ 23 августа 2011

Я пытаюсь создать программу с использованием Winsock2, где я могу отправить сообщение от клиента к серверу.Я могу сделать это, но проблема в том, что я могу отправить только одно сообщение, а затем мне нужно перезапустить сервер, чтобы получить следующее сообщение.Вот код для сервера.Часть, в которой я действительно запутался, это то, что у меня есть функция recv() в цикле while, так почему он не продолжает «получать» данные?ниже.

WSADATA wsaData;
int bytes_sent;
char send_msg[] = "super cool message!";

WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in ConnectInfo;

ConnectInfo.sin_family = AF_INET;
ConnectInfo.sin_addr.s_addr = inet_addr("127.0.0.1");
ConnectInfo.sin_port = htons(8888);

connect(ConnectSocket, (SOCKADDR*)&ConnectInfo, sizeof(ConnectInfo));
bytes_sent = send(ConnectSocket, send_msg, sizeof(send_msg), 0);
closesocket(ConnectSocket);
WSACleanup();

Я делаю это в Windows 7 с помощью компилятора MinGW.Заранее спасибо.

1 Ответ

2 голосов
/ 23 августа 2011

Вы не показывали код отправки вашего клиента, но случайно, ваш код чтения сервера не учитывает, что отправка и получение НЕ являются 1-к-1 в программировании TCP / IP.Если клиент отправляет 2 сообщения, сервер может получить оба сообщения или даже их части в одной и той же операции чтения!Вы говорите сокету вашего сервера читать 2048 байт за раз.Он вернет все, что в данный момент доступно на сокете в данный момент.TCP / IP - это поток байтов, с ним нужно обращаться как можно больше.Это означает, что вам нужно либо поместить разделитель между вашими сообщениями, либо поставить вокруг них рамку, чтобы узнать, где заканчивается одно сообщение и начинается следующее сообщение.

...