fonctionnement étrange de recv()
Bonjour à toutes et à tous.
Vous ai t'il déjà arrivé d'avoir le buffer passé en paramètre de recv() prendre la valeur de celui passé en paramètre de send() ?
Contexte :
J'ai trois thread, un qui traite les données à envoyer, un qui traite les données reçues et le dernier qui communique avec un serveur.
Reception :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| fd_set fdRead;
int n;
struct timeval timeoutSel;
char buffer[256];
if(Gprs_Call_State < GPRS_CALL_TCP_DISCONNECT_IN_PROGRESS && Gprs_Call_State >= GPRS_CALL_TCP_CONNECTED)
{
timeoutSel.tv_sec = time;
timeoutSel.tv_usec = 0;
FD_ZERO(&fdRead);
FD_SET(sockfd, &fdRead);
if(select(sockfd + 1, &fdRead, NULL, NULL, &timeoutSel) == -1)
{
perror("select()\r\n");
return -1;
}
if(FD_ISSET(sockfd, &fdRead))
{
n = recv(sockfd, buffer, 256, 0);
if( n == 0)/* Server down*/
{
perror("grps_recv_data()");
exit(erno);
}
puts(buffer);
}
} |
envoi
appel de gprs_send_data_by_TCP() par le thread de gestion des données a envoyer:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| int gprs_send_data_by_TCP(const char *data, const size_t length)
{
if(strlen(TCP_buffer) < length && Gprs_Call_State < GPRS_CALL_DISCONNECT_START
&& Gprs_Call_State >= GPRS_CALL_CONNECTED)
{
strcpy(TCP_buffer, data);
return 0;
}
else
{
return -1;
}
} |
puis
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
if(TCP_buffer[0] != '\0')
{
ret = send(sockfd, TCP_buffer, strlen(TCP_buffer), MSG_DONTWAIT);
if(ret < 0)
{ //Error
perror("Error send");
Gprs_Call_State = GPRS_CALL_TCP_DISCONNECT_START;
}
else if(ret < strlen(TCP_buffer))
{
puts("\r\nconnection interrupted \r\n");
Gprs_Call_State = GPRS_CALL_TCP_DISCONNECT_START;
}
else
{ //OK
memset(TCP_buffer, '\0', GPRS_STRMAXSIZE);
Gprs_Call_State = GPRS_CALL_TCP_CONNECTED;
}
} |
Merci