This question is kind of a follow-up of a question that I previously asked. Basically I had a c++ server running in ubuntu and I'm now trying to make this code works in windows. I am having some issues with windows socket as it's my first time using them. After some troubles just receiving data on the socket I am now faced with something weird: the buffer that I pass to recv()
always contains the same data.
Of course, I have checked my client and it does send something different.
So I've been trying my best to get something that would help me figure out what was wrong. I printed on the console the number of bytes received by recv()
and guess what it is changing as expected ! So I'm a little puzzled now, I don't quite get whu the number of bytes received would be different if the content of the buffer that I pass to recv() is always the same. Would like some help to figure out why.
Here is my code:
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 ;
}
Thansk in advance for the help you will provide me.
Since you never reset
i
,matrix
will never be updated after the first time. Therecv
is fine.