Tu y découvriras, par exemple, que le déclenchement de DataArrival ne veut pas dire que toutes les données sont arrivées, mais simplement qu'il y a quelque chose à lire dans le buffer.
Il te faut donc gérer la mémorisation des données jusqu'à ce qu'elles soient complètes.
#if defined (WIN32) #include <winsock2.h> #elif defined (linux) #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include #include #define INVALID_SOCKET -1 #define SOCKET_ERROR -1 #define closesocket(s) close (s) typedef int SOCKET; typedef struct sockaddr_in SOCKADDR_IN; typedef struct sockaddr SOCKADDR; #endif #include <stdio.h> #include <stdlib.h> int finish; char mot; int sock_err; int main (void) { #if defined (WIN32) WSADATA WSAData; int erreur = WSAStartup(MAKEWORD(2,0), &WSAData); #else int erreur = 0; #endif SOCKET sock; SOCKADDR_IN sin; SOCKET csock; SOCKADDR_IN csin; int recsize = (int) sizeof csin; unsigned char buffer[512]=""; unsigned char mat[]={0,0,0}; unsigned char state[]={0,0}; int Nbr; int i; unsigned char cmdVisonic[]={0xF0,0x40}; // Si les sockets Windows fonctionnent if(!erreur) { // Création de la socket sock = socket(AF_INET, SOCK_STREAM, 0); // Configuration de la connexion sin.sin_addr.s_addr = inet_addr("192.168.1.245"); sin.sin_family = AF_INET; sin.sin_port = htons(10001); sock_err = bind (sock, (SOCKADDR *) &sin, sizeof sin); // Si l'on a réussi à se connecter finish =1; //csock = accept (sock, (SOCKADDR *) &csin, &recsize); if(connect(sock, (SOCKADDR *)&sin, sizeof(sin)) != SOCKET_ERROR) { printf("Connection à %s sur le port %d\n", inet_ntoa (sin.sin_addr), htons(sin.sin_port)); // Si l'on reçoit des informations : on les affiche à l'écran if ((Nbr=send(sock, cmdVisonic, 2,0))!=SOCKET_ERROR) { printf("Sent Visonic command\n"); do { if((Nbr=recv(sock, buffer, sizeof(buffer), 0)) != SOCKET_ERROR) { // printf("Recu : Nbr - %d\n", Nbr); if (Nbr==1) { switch (buffer[0]){ case 0x24: // printf("PIR detector\n"); break; case 0x42: // printf("telecommande\n"); break; } } else { if (Nbr==5) { // printf("TCode materiel PIR : %02x%02x%02x - etat :%02x%02x %02x%02x\n",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],state[0],state[1]); if ((buffer[0]==mat[0]) && (buffer[1]==mat[1]) && (buffer[2]==mat[2])) { // printf("Here\n"); if (!((buffer[3]==state[0]) && (buffer[4]==state[1]))) { printf("Code materiel PIR : %02x%02x%02x - etat :%02x%02x\n",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4]); state[0]=buffer[3]; state[1]=buffer[4]; } } else { mat[0]=buffer[0]; mat[1]=buffer[1]; mat[2]=buffer[2]; state[0]=buffer[3]; state[1]=buffer[4]; printf("Code materiel PIR : %02x%02x%02x - etat :%02x%02x\n",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4]); } } if (Nbr==9) { if ((buffer[4]==mat[0]) && (buffer[5]==mat[1]) && (buffer[6]==mat[2])) { if (!((buffer[7]==state[0]) && (buffer[8]==state[1]))) { printf("Code materiel telecommande: %02x%02x%02x - etat :%02x%02x\n",buffer[4],buffer[5],buffer[6],buffer[7],buffer[8]); state[0]=buffer[7]; state[1]=buffer[8]; } } else { mat[0]=buffer[4]; mat[1]=buffer[5]; mat[2]=buffer[6]; state[0]=buffer[7]; state[1]=buffer[8]; printf("Code materiel telecommande: %02x%02x%02x - etat :%02x%02x\n",buffer[4],buffer[5],buffer[6],buffer[7],buffer[8]); } } } // for (i=0;i<Nbr; i++) // printf("%02x ",buffer[i]); //} /* if (buffer[0]=='1') { //sock_err = listen (sock, 5); puts("Saisir une lettre") ; scanf("%s", &buffer); sock_err = send(csock, buffer, sizeof(buffer), 0); if (sock_err != SOCKET_ERROR) printf("Chaine envoyée : %s\n", buffer); else puts("error"); } else puts("Oh no!"); */ } } while (finish == 1); } else printf("Failed sending command\n"); } // sinon, on affiche "Impossible de se connecter" else printf("Impossible de se connecter\n"); //finish++; // On ferme la socket closesocket(sock); #if defined (WIN32) WSACleanup(); #endif } // On attend que l'utilisateur tape sur une touche, puis on ferme getchar(); return EXIT_SUCCESS; }
Private Sub Socket_DataArrival(ByVal bytesTotal As Long) 'Les données arrivent Dim strdata As String Dim data As Long txtResult.Text " data " & Hex(data) End Sub
Private Sub Socket_DataArrival(ByVal bytesTotal As Long) 'Les données arrivent Dim strdata As String Dim data As Byte ESECO.txtData ESECO.txtData & "longueur " & CStr(bytesTotal) & vbCrLf For i = 1 To bytesTotal socket.GetData data, vbByte ESECO.txtData = ESECO.txtData & Hex(data) & " " Next ESECO.txtData = ESECO.txtData & vbCrLf & vbCrLf
Dim aData() As Byte ReDim aData(0 To bytesTotal - 1) socket.GetData aData(0), vbByte, bytesTotalou qqchose de ressemblant
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question