[英]Receiving multiple messages Winsock2 C++
我正在嘗試使用Winsock2創建一個程序,我可以從客戶端向服務器發送消息。 我可以這樣做,但問題是我只能發送一條消息然后我必須重新啟動服務器才能接收下一條消息。 這是服務器的代碼。 我真的很困惑的部分是我在while
循環中有recv()
函數,為什么不繼續“接收”數據呢?
WSADATA wsaData;
int bytes_recieved;
char data_recieve[2048];
string output;
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN ServerInfo;
ServerInfo.sin_family = AF_INET;
ServerInfo.sin_addr.s_addr = INADDR_ANY;
ServerInfo.sin_port = htons(8888);
bind(ListenSocket, (LPSOCKADDR)&ServerInfo, sizeof(struct sockaddr));
listen(ListenSocket, 1);
SOCKET ClientSocket = accept (ListenSocket, NULL, NULL);
while(true)
{
bytes_recieved = recv(ClientSocket, data_recieve, 2048, 0);
if (bytes_recieved > 1)
{
cout << data_recieve;
}
}
closesocket(ClientSocket);
closesocket(ListenSocket);
WSACleanup();
客戶(發件人)列在下面。
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編譯器執行此操作。 先感謝您。
您沒有顯示您的客戶端發送代碼,但是,您的服務器讀取代碼沒有考慮到TCP / IP編程中的發送和接收不是1比1。 如果客戶端發送2條消息,服務器可能會在同一個讀取操作中接收這兩條消息,甚至是它們的一部分! 您告訴您的服務器套接字一次讀取2048個字節。 它將返回當時套接字上當前可用的內容。 TCP / IP是一個字節流,你需要對它進行多少處理。 這意味着您需要在消息之間放置分隔符,或者在它們周圍放置一個框架,以便知道一條消息的結束位置以及下一條消息的開始位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.