recv 函数总是给我相同的缓冲区
recv function always gives me the same buffer
这个问题是我之前提出的问题的后续问题。基本上我在 ubuntu 中有一个 C++ 服务器 运行,我现在正试图让这段代码在 windows 中工作。我在使用 windows 套接字时遇到了一些问题,因为这是我第一次使用它们。在仅在套接字上接收数据时遇到一些麻烦后,我现在遇到了一些奇怪的事情:我传递给 recv()
的缓冲区始终包含相同的数据。
当然,我已经检查了我的客户端,它确实发送了一些不同的东西。
所以我一直在尽我最大的努力得到一些可以帮助我找出问题所在的东西。我在控制台上打印了 recv()
接收到的字节数,并猜测它正在按预期发生变化!所以我现在有点困惑,如果我传递给 recv() 的缓冲区内容始终相同,我不太明白接收到的字节数是否会有所不同。需要一些帮助来找出原因。
这是我的代码:
int tcp_server::acceptConns()
{
sockaddr_in from;
bool infinite = true ;
int fromlen=sizeof(from);
/* Infinte loop to echo
the IP address of the client */
int readsize;
char* message;
char* clientmessage = (char*) malloc(256*sizeof(char));
string smatrix ;
int ind ;
string tok;
int i = 0 ;
int bytesSent ;
float matrix[16] ;
do {
readsize = recv(ClientSocket, clientmessage, 256, 0);
if (readsize > 0) {
printf("Bytes received: %d\n", readsize);
message = "ack";
bytesSent = send(ClientSocket, message, strlen(message),0);
if(bytesSent == 0){
std::cerr << "Error sending ACK" << endl ;
}
smatrix = clientmessage ;
std::stringstream ss(smatrix);
while(getline(ss, tok, ',') && i < 16 ){
matrix[i] = static_cast<float>(::atof(tok.c_str()));
i++ ;
}
coutMessage(matrix);
message ="ok";
bytesSent = send(ClientSocket, message, strlen(message),0);
if(bytesSent == 0){
std::cerr << "Error sending OK" << endl ;
}
}
else if (readsize == 0)
printf("Connection closing...\n");
else {
printf("recv failed with error: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
} while (readsize > 0);
// shutdown the connection since we're done
readsize = shutdown(ClientSocket, SD_SEND);
if (readsize == SOCKET_ERROR) {
printf("shutdown failed with error: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
// cleanup
closesocket(ClientSocket);
WSACleanup();
return 0 ;
}
在此先感谢您为我提供的帮助。
while(getline(ss, tok, ',') && i < 16 ){
matrix[i] = static_cast<float>(::atof(tok.c_str()));
i++ ;
}
由于您从未重置 i
,matrix
将永远不会在第一次后更新。 recv
没问题。
这个问题是我之前提出的问题的后续问题。基本上我在 ubuntu 中有一个 C++ 服务器 运行,我现在正试图让这段代码在 windows 中工作。我在使用 windows 套接字时遇到了一些问题,因为这是我第一次使用它们。在仅在套接字上接收数据时遇到一些麻烦后,我现在遇到了一些奇怪的事情:我传递给 recv()
的缓冲区始终包含相同的数据。
当然,我已经检查了我的客户端,它确实发送了一些不同的东西。
所以我一直在尽我最大的努力得到一些可以帮助我找出问题所在的东西。我在控制台上打印了 recv()
接收到的字节数,并猜测它正在按预期发生变化!所以我现在有点困惑,如果我传递给 recv() 的缓冲区内容始终相同,我不太明白接收到的字节数是否会有所不同。需要一些帮助来找出原因。
这是我的代码:
int tcp_server::acceptConns()
{
sockaddr_in from;
bool infinite = true ;
int fromlen=sizeof(from);
/* Infinte loop to echo
the IP address of the client */
int readsize;
char* message;
char* clientmessage = (char*) malloc(256*sizeof(char));
string smatrix ;
int ind ;
string tok;
int i = 0 ;
int bytesSent ;
float matrix[16] ;
do {
readsize = recv(ClientSocket, clientmessage, 256, 0);
if (readsize > 0) {
printf("Bytes received: %d\n", readsize);
message = "ack";
bytesSent = send(ClientSocket, message, strlen(message),0);
if(bytesSent == 0){
std::cerr << "Error sending ACK" << endl ;
}
smatrix = clientmessage ;
std::stringstream ss(smatrix);
while(getline(ss, tok, ',') && i < 16 ){
matrix[i] = static_cast<float>(::atof(tok.c_str()));
i++ ;
}
coutMessage(matrix);
message ="ok";
bytesSent = send(ClientSocket, message, strlen(message),0);
if(bytesSent == 0){
std::cerr << "Error sending OK" << endl ;
}
}
else if (readsize == 0)
printf("Connection closing...\n");
else {
printf("recv failed with error: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
} while (readsize > 0);
// shutdown the connection since we're done
readsize = shutdown(ClientSocket, SD_SEND);
if (readsize == SOCKET_ERROR) {
printf("shutdown failed with error: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
// cleanup
closesocket(ClientSocket);
WSACleanup();
return 0 ;
}
在此先感谢您为我提供的帮助。
while(getline(ss, tok, ',') && i < 16 ){
matrix[i] = static_cast<float>(::atof(tok.c_str()));
i++ ;
}
由于您从未重置 i
,matrix
将永远不会在第一次后更新。 recv
没问题。