2010-10-14 18 views
1

Je reçois des paquets UDP du port en continu. Voici le journal de wireshark. Comment recevoir ces paquets en continu en utilisant la programmation de winsock. J'ai essayé mais je ne peux pas recevoir. Après l'appel recvfrom(), il n'écrit pas dans un tampon. Donnez-moi une idée, comment recevoir chaque paquet dans un tampon et écrire chaque paquet dans un fichier texte. Aidez-moi, s'il vous plaît. Merci à l'avance ...Problème lors de la réception de paquets UDP

Source IP est 192.168.13.25 & le port non est 2780 (Source est un matériel qui envoie des paquets UDP en continu) Dest IP est 192.168.13.250 le port & non est 45141 (destination est mon PC Dans mon code je lie à 192.168.13.250 (PC) et au port 2780 (Hardware). Ensuite, j'appelle recvfrom(). Y at-il une discordance dans IP & port? alors quel numéro de port IP & dois-je obtenir de l'utilisateur pour bind() et recvfrom()?

No Time Source Destination Proto Infos
1 0,000000 192.168.13.25 192.168.13.250 Port UDP Source: BLC contrôle le port de destination: 45141 2 0,000416 192.168.13.25 192.168.13.250 Port UDP Source: BLC contrôle le port de destination: 45141 3 0.000846 192.168.13.25 192.168.13.250 UDP Port source: lbc-control Port de destination: 45141 4 0.001281 192.168.13.25 192.168.13.250 UDP Port source: lbc-control Port de destination: 45141 5 0.001716 192.168.13.25 192.168.13.250 UDP Port source: lbc-control Port de destination: 45141 6 0.002152 192.168.13.25 192.168.13.250 UDP Port source: lbc-control Port de destination: 45141 7 0.002589 192.168.13.25 19 2.168.13.250 Port UDP Source: BLC contrôle le port de destination: 45141 8 0,003025 192.168.13.25 192.168.13.250 Port UDP Source: BLC contrôle le port de destination: 45141

Après mon code:

int main(void) { 
    SOCKET recvSockID; 
    WSADATA wsaData = {0}; 
    FILE *udp; 
    FILE *fp ; 

    struct sockaddr_in sock_addr; 
    struct sockaddr_in cliAddr; 

    static int recvData; 
    int iResult = 0; 
    int sock_len = sizeof(sock_addr); 
    int sockCli_len = sizeof(cliAddr); 
    int recvResult; 
    static int iteration; 

    fp = fopen("outOfSeq.txt","a"); 

    if((udp = fopen("udpData.txt","w")) == 0) 
     printf("udpData.txt not opened\n"); 

    printf("\n Enter Destination IP Address : "); 
    scanf_s("%s",inputData.destIPAddr,16); 

    printf("\n Enter Destination port from which to receive data : "); 
    scanf_s("%d",&inputData.portNo,5); 

    printf("\n Enter No.of iterations : "); 
    scanf_s("%d",&inputData.noIteration,2); 

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 
    if(iResult < 0) { 
     printf("windows socket startup error\n"); 
    } 

    recvSockID = socket(AF_INET, SOCK_DGRAM, 0); 
    if(recvSockID < 0) { 
     printf("Socket creation error\n"); 
     WSACleanup(); 
    } 

    sock_addr.sin_family = AF_INET; 
    sock_addr.sin_port = htons(inputData.portNo); 
    sock_addr.sin_addr.s_addr = inet_addr(inputData.destIPAddr); 
    //sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); 

    if(bind(recvSockID, (struct sockaddr *)&sock_addr, 
     sizeof(struct sockaddr)) < 0) 
    { 
     printf("bind() failed: %ld.\n", WSAGetLastError()); 
     closesocket(recvSockID); 
     return 0; 
    } 

    memset(udpBuf, 0, sizeof(udpBuf)); 

    iteration = inputData.noIteration; 
    recvData = 1; 

    while (recvData) { 
     printf("receiving data\n"); 
     recvResult = recvfrom(recvSockID, udpBuf, sizeof(udpBuf), 
      0, (struct sockaddr *)&cliAddr, &sockCli_len); 

     if (recvResult <= 0) { 
      printf("recvResult = %d\n", recvResult); 

      printf("Error Code: %d",WSAGetLastError()); 

      printf("Socket receive()- error\n"); 
      return 0; 
      //break; 
      //goto exit; 
     } else 
      printf("Socket receive()- success\n"); 

     printf("completed rx data\n"); 

     fwrite(udpBuf, sizeof(udpBuf), 1, udp); 
     memset(udpBuf, 0, sizeof(udpBuf)); 

     if (iteration != 0) { 
      iteration--; 
      if (iteration <= 0) 
       recvData = 0; 
     } 
    } 

//exit: 
    if(udp) { 
     fclose(udp); 
     udp = 0; 
    } 

    //shutdown socket 
    closesocket(recvSockID);  
    fclose(udp); 

    return 0; 
} 
+1

après ce que vous avez essayé, nous allons essayer de vous aider. 'envoyez-moi le codez' ne suffira généralement pas. – KevinDTimm

+0

Maintenant, j'ai ajouté le code source – ulaga

Répondre

1
  1. fwrite(udpBuf, sizeof(udpBuf), 1, udp)

    Vous devez passer recvResult au lieu de sizeof(udpBuf).

  2. Il se peut que vous ne voyiez pas immédiatement les octets de votre fichier en raison de la mise en mémoire tampon des fichiers. Cependant, après le close vous devriez voir les données.

    Si vous souhaitez désactiver la mise en mémoire tampon, utilisez setvbuf(udp, NULL, _IONBF, 0) ou, en guise d'alternative, appelez fflush(udp) après chaque opération d'écriture.

MISE À JOUR:

Si vous ne recevez pas datagrammes du tout, il est probable que vous lier la mauvaise adresse ou le port.

+0

Merci pour la suggestion. Mon code ne sort pas de l'appel recvfrom(). Après le contrôle arrive à recvfrom(), je ne peux pas déboguer s'il met chaque paquet dans le tampon ou non. Comment recevoir le paquet par paquet comme le wireshark ??? – ulaga

+0

@ulaga: Il retournera quand un paquet est reçu. Quelle est l'adresse stockée dans 'inputData.destIPAddr'? Ce devrait être l'adresse de votre interface réseau, ou '0.0.0.0'. – jweyrich

+0

destIPAddr est l'interface locale et portNo est le côté cible .... – ulaga