Ho tirato fuori questi 2 algoritmi per l'invio e la ricezione dei messaggi,ma il problema è che arrivano sempre spezzati ad ogni spazio.
per la ricezione:
int recvMsg(SOCKET s,char * recvBuf,int length)
{
int result = 0,
i = 0,
posix = 0;
char tempBuffer [MAX_BUFFER_LENGTH];
char temporanyBuffer[REMAINS_BUFFER_LENGTH];
ZeroMemory(&tempBuffer,MAX_BUFFER_LENGTH);
ZeroMemory(&temporanyBuffer,REMAINS_BUFFER_LENGTH);
result = recv(s,tempBuffer,MAX_BUFFER_LENGTH,0);
if(result < 0)
return result;
while(true)
{
if(tempBuffer[i] == '\0')
{
strcpy(recvBuf,tempBuffer);
ZeroMemory(&recvBuf,sizeof(recvBuf));
break;
}else if(tempBuffer[i] != '\0' && i == strlen(tempBuffer))
{
result = recv(s,temporanyBuffer,REMAINS_BUFFER_LENGTH,0);
if(check_if_null_terminated(temporanyBuffer))
{
strcpy(recvBuf,temporanyBuffer);
ZeroMemory(&temporanyBuffer,REMAINS_BUFFER_LENGTH);
break;
}else
{
posix = check_position_of_string(temporanyBuffer,tempBuffer);
strcat(tempBuffer,return_substring(posix,temporanyBuffer));
i++;
}
continue;
}
i++;
}
}
int check_if_null_terminated(char* str1)
{
int i = 0;
while(true)
{
if(str1[i] == '\0')
{
return 1;
}else
return 0;
}
}
int check_position_of_string(char * stringToCompare,char * comparingString)
{
int i = 0;
while(true)
{
if(stringToCompare[i] == comparingString[i])
continue;
else if(stringToCompare[i] != comparingString[i])
{
return i;
break;
}
}
}
char * return_substring(int posix,char * string1)
{
string str1(string1);
int difference = strlen(string1) - posix;
string container = str1.substr(posix,difference);
char * conversion = const_cast <char *>(container.c_str());
return conversion;
}
per l'invio:
int sendMsg(SOCKET s,char * sendBuf,int length)
{
int len = strlen(sendBuf);
int byte_sent = send(s,sendBuf,len,0);
do
{
if(byte_sent < 0)
return byte_sent;
else if(byte_sent == len)
return 0;
else if(byte_sent < len)
{
char temporanyBuffer[RESEND_BUFFER_LENGTH];
ZeroMemory(&temporanyBuffer,RESEND_BUFFER_LENGTH);
strcpy(temporanyBuffer,retrive_posix(sendBuf,byte_sent));
len = strlen(temporanyBuffer);
byte_sent = send(s,temporanyBuffer,len,0);
}
}while (byte_sent > 0);
}
char * retrive_posix(char * sendBuf,int byte_sent)
{
string sendStr(sendBuf);
return const_cast<char *>(sendStr.substr(byte_sent,strlen(sendBuf) - byte_sent).c_str());
}
Però ho cercato su internet e a quanto ho visto pochi hanno avuto il mio stesso problema,molti usano le funzioni recv() e send() senza verificare che il messaggio arrivi intero.
MI chiedo perchè a me il messaggio venga spezzato proprio fra gli spazi, e non in qualche altra parte (come sarebbe più logico dato che uso lo stream_socket).