views:

58

answers:

1

Hi, 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;
}
A: 
  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.

jweyrich
Thanks for suggestion. My code is not coming out of recvfrom() call. After control comes to recvfrom(), I can't able to debug whether it is putting each packets into buffer or not. How to receive packet by packet as like wireshark???
ulaga
@ulaga: It will return when a packet is received. What's the address stored in `inputData.destIPAddr`? It should be the address of your network interface, or `0.0.0.0`.
jweyrich
destIPAddr is local interface and portNo is Target side....
ulaga
In a single iteration how much recvfrom() will receive? whether a single packet or group of packets?
ulaga
@ulaga: I'm not sure what you mean by `target side`. portNo must be the port you're willing to receive packets on. If this doesn't solve the question, please update your question to give more details about your scenario (what IP sends what, to which port, etc).
jweyrich
I have updated my question???Some where I'm missing the sequence..I can't able to debug...
ulaga
@ulaga: correcting my first comment, recvfrom returns a single datagram per call. If a datagram is too large, it's fragmented in various packets, and reassembled before the function returns.
jweyrich
how can I bind to target hardware from my PC and How can I receive packet??? Please just give me ur idea.....
ulaga
@ulaga: So, are you binding the socket to address 192.168.13.250 and port 45141? Where is `udpBuf` defined? How large is it?
jweyrich
No I'm binding the socket to address 192.168.13.250 and port 2780...
ulaga
Each packet size is 4k. So I defined udpBuf as char udpBuf[5000]. It is in header file...
ulaga
@ulaga: there is your problem, wrong port.
jweyrich
so I need to bind to local IP and port no..not hardware port no..Am I right???? Is buf size ok???
ulaga
jweyrich
ok....thanks a lot for ur suggestion...
ulaga
After clicking up arrow it is giving vote up requires 15 reputation..what is that?
ulaga
@ulaga: it's the reputation system. To understand it, read the FAQ - http://stackoverflow.com/faq
jweyrich