2010-10-14 4 views
1

Я получаю UDP-пакеты из порта непрерывно. Ниже приведен журнал из wirehark. Как получать эти пакеты непрерывно с помощью программирования winsock. Я пытался, но я не могу получить. После вызова recvfrom() он не записывает в буфер. Дайте мне идею, как получить каждый пакет в буфере и записать каждый пакет в текстовый файл. Пожалуйста, помогите мне. Заранее спасибо ...проблема при получении UDP-пакетов

Source IP является 192.168.13.25 & порта не есть 2780 (Источник представляет собой аппаратное обеспечение, которое будет посылать непрерывно пакеты UDP) Dest IP является 192.168.13.250 & порта не есть 45141 (Destination не мой PC) В моем коде я привязываюсь к 192.168.13.250 (ПК) и порту 2780 (аппаратное обеспечение). Затем я вызываю recvfrom(). Есть ли несоответствие в Ip & порт ?? , так что IP & порт нет, мне нужно получить от пользователя для bind() и recvfrom()?

No Time Источник назначения Прото информация
1 0,000000 192.168.13.25 192.168.13.250 UDP Порт источника: LBC-контроль Порт назначения: 45141 2 0,000416 192.168.13.25 192.168.13.250 UDP Порт источника: LBC-контроль Порт назначения: 45141 3 0.000846 192.168.13.25 192.168.13.250 UDP Исходный порт: lbc-control Порт назначения: 45141 4 0.001281 192.168.13.25 192.168.13.250 UDP Исходный порт: lbc-control Порт назначения: 45141 5 0.001716 192.168.13.25 192.168.13.250 UDP Исходный порт: lbc-control Порт назначения: 45141 6 0.002152 192.168.13.25 192.168.13.250 UDP Исходный порт: lbc-control Порт назначения: 45141 7 0.002589 192.168.13.25 19 2.168.13.250 UDP Порт источника: LBC-контроль Порт назначения: 45141 8 0,003025 192.168.13.25 192.168.13.250 UDP Порт источника: LBC-контроль Порт назначения: 45141

Ниже мой код:

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

опубликуйте, что вы пробовали, мы постараемся помочь. 'send me tezzzz' обычно не хватает. – KevinDTimm

+0

Теперь я добавил исходный код – ulaga

ответ

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

    Вы должны пройти recvResult вместо sizeof(udpBuf).

  2. Возможно, вы не можете сразу увидеть байты вашего файла из-за файловой буферизации. Однако после close вы должны увидеть данные.

    Если вы хотите отключить буферизацию, используйте setvbuf(udp, NULL, _IONBF, 0) или, как альтернативу, вызовите fflush(udp) после каждой операции записи.

UPDATE:

Если вы не получаете дейтаграмм вообще, это, скорее всего, вы связываете неверный адрес или порт.

+0

Спасибо за предложение. Мой код не выходит из вызова recvfrom(). После того, как элемент управления появился в recvfrom(), я не могу отлаживать, помещает ли каждый пакет в буфер или нет. Как получить пакет по пакету как wirehark ??? – ulaga

+0

@ulaga: он будет возвращен при получении пакета. Каков адрес, хранящийся в 'inputData.destIPAddr'? Это должен быть адрес вашего сетевого интерфейса, или '0.0.0.0'. – jweyrich

+0

destIPAddr - это локальный интерфейс, а portNo - целевая сторона .... – ulaga

Смежные вопросы