我正在尝试使用Winsock2创建一个程序,我可以从客户端向服务器发送消息。我可以这样做,但问题是我只能发送一条消息然后我必须重新启动服务器才能接收下一条消息。这是服务器的代码。我真的很困惑的部分是我在recv()
循环中有while
函数,为什么不继续“接收”数据呢?
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编译器执行此操作。提前谢谢。
答案 0 :(得分:2)
您没有向客户端发送代码,但是您的服务器读取代码没有考虑到TCP / IP编程中的发送和接收不是1对1。如果客户端发送2条消息,服务器可能会在同一个读取操作中接收这两条消息,甚至是它们的一部分!您告诉您的服务器套接字一次读取2048个字节。它将返回当时套接字上当前可用的内容。 TCP / IP是一个字节流,你需要对它进行多少处理。这意味着您需要在消息之间放置分隔符,或者在它们周围放置一个框架,以便知道一条消息的结束位置以及下一条消息的开始。