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 :
envoi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); } }
appel de gprs_send_data_by_TCP() par le thread de gestion des données a envoyer:
puis
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
Partager