简体   繁体   English

使用Winsock接收UDP数据包

[英]Receiving UDP packets using winsock

I'm getting UDP packets from the port continuously. 我不断从端口获取UDP数据包。 Following is the log from wireshark. 以下是wireshark的日志。 How to receive those packets continuously using winsock programming. 如何使用Winsock编程连续接收那些数据包。 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. 在recvfrom()调用之后,它没有写入缓冲区。请给我一个想法,如何接收缓冲区中的每个数据包并将每个数据包写入文本文件。 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). 源IP是192.168.13.25,端口号是2780(源是将连续发送UDP数据包的硬件)目的地IP是192.168.13.250,端口号是45141(目的地是我的PC)在我的代码中,我绑定到192.168。 13.250(PC)和端口2780(硬件)。 Then I'm calling recvfrom(). 然后我打电话给recvfrom()。 Is there any mismatch in Ip & port?? Ip和端口是否有任何不匹配? so which IP & port no do I need to get from user for bind() and recvfrom()? 所以我不需要从用户那里获得哪个IP和端口的bind()和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) . 您应该传递recvResult而不是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. 但是, close您应该会看到数据。

    If you want to disable buffering, use setvbuf(udp, NULL, _IONBF, 0) , or as alternative, call fflush(udp) after each write operation. 如果要禁用缓冲,请使用setvbuf(udp, NULL, _IONBF, 0) ,或者在每次写入操作后调用fflush(udp)

UPDATE: 更新:

If you're not receiving datagrams at all, it's likely you're binding the wrong address or port. 如果您根本没有收到数据报,则可能是您绑定了错误的地址或端口。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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