简体   繁体   中英

Receiving UDP packets using winsock

I'm getting UDP packets from the port continuously. Following is the log from wireshark. How to receive those packets continuously using winsock programming. I tried but I can't able to receive. After recvfrom() call it is not writing into a buffer.Give me idea, how to receive each packet in a buffer and write each packet into to a text file. Please help me. Thanks in advance...

Source IP is 192.168.13.25 & port no is 2780 (Source is a Hardware which will send UDP packets continuously) Dest IP is 192.168.13.250 & port no is 45141(Destination is my PC) In my code I'm binding to 192.168.13.250(PC) and port 2780(Hardware). Then I'm calling recvfrom(). Is there any mismatch in Ip & port?? so which IP & port no do I need to get from user for bind() and recvfrom()?

No  Time        Source          Destination     Proto  Info                                                                       
1   0.000000    192.168.13.25   192.168.13.250  UDP    Source port: lbc-control  Destination port: 45141
2   0.000416    192.168.13.25   192.168.13.250  UDP    Source port: lbc-control  Destination port: 45141
3   0.000846    192.168.13.25   192.168.13.250  UDP    Source port: lbc-control  Destination port: 45141
4   0.001281    192.168.13.25   192.168.13.250  UDP    Source port: lbc-control  Destination port: 45141
5   0.001716    192.168.13.25   192.168.13.250  UDP    Source port: lbc-control  Destination port: 45141
6   0.002152    192.168.13.25   192.168.13.250  UDP    Source port: lbc-control  Destination port: 45141
7   0.002589    192.168.13.25   192.168.13.250  UDP    Source port: lbc-control  Destination port: 45141
8   0.003025    192.168.13.25   192.168.13.250  UDP    Source port: lbc-control  Destination port: 45141

Following is my 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. fwrite(udpBuf, sizeof(udpBuf), 1, udp)

    You should pass recvResult instead of sizeof(udpBuf) .

  2. You may not be immediately seeing the bytes on your file due to file buffering. However, after the close you should see the data.

    If you want to disable buffering, use setvbuf(udp, NULL, _IONBF, 0) , or as alternative, call fflush(udp) after each write operation.

UPDATE:

If you're not receiving datagrams at all, it's likely you're binding the wrong address or port.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM