簡體   English   中英

UDP多播接收2 ^ 24字節的數據,這應該是不可能的

[英]UDP multicast receives 2^24 bytes of data which should be impossible

在WinXP上有一台運行VS6的獨立PC-是古老的技術。 我正在從Linux移植C代碼應用程序。 卡在多播問題上

 #include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>      /* for printf(), fprintf() */
#include <conio.h>
#include <winsock.h>    /* for socket(),... */
#include <stdlib.h>     /* for exit() */

#define MAXRECVSTRING 255  /* Longest string to receive */

int main(int argc, char* argv[])
{
    char msg[100];
    char loopchar = 0;
    int iOptVal = 0;
    char iOptVal2 = 1;
    int iLenOptVal = sizeof(int);
    int result = -1;
    int retval = -1;
    int set_option_on = 1;

    int sock;                         /* Socket */
    struct sockaddr_in multicastAddr; /* Multicast Address */
    char *multicastIP;                /* IP Multicast Address */
    unsigned short multicastPort;     /* Port */
    char recvString[MAXRECVSTRING+1]; /* Buffer for received string */
    unsigned int recvStringLen;       /* Length of received string */
    struct ip_mreq multicastRequest;  /* Multicast address join structure */
    WSADATA wsaData;                  /* Structure for WinSock setup communication */

    if (argc != 3)    /* Test for correct number of arguments */
    {
        fprintf(stderr,"Usage: %s <Multicast IP> <Multicast Port>\n", argv[0]);
        exit(1);
    }

    multicastIP = argv[1];        /* First arg: Multicast IP address (dotted quad) */
    //WW Silversilsied  //WW SilversilsiedmulticastIP = inet_addr("224.000.010.101");       /* First arg: Multicast IP address (dotted quad) */
    //multicastIP = inet_addr("224.000.010.101");       /* First arg: Multicast IP address (dotted quad) */
    multicastPort = atoi(argv[2]);/* Second arg: Multicast port */
    //multicastPort = 6600);/* Second arg: Multicast port */

    if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) /* Load Winsock 2.0 DLL */
    {
        fprintf(stderr, "WSAStartup() failed");
        exit(1);
    }

    /* Create a best-effort datagram socket using UDP */
    if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
    {
        printf("\nsocket() failed - error = %d\n", sock);
    }

    /* Construct bind structure */
    memset(&multicastAddr, 0, sizeof(multicastAddr));   /* Zero out structure */
    multicastAddr.sin_family = AF_INET;                 /* Internet address family */
    multicastAddr.sin_addr.s_addr = htonl(INADDR_ANY);  /* Any incoming interface */
    multicastAddr.sin_port = htons(multicastPort);      /* Multicast port */

    /* Bind to the multicast port */
    retval = bind(sock, (struct sockaddr *) &multicastAddr, sizeof(multicastAddr));
    if (retval < 0)
    {
        printf("\nbind() failed - error = %d\n", retval);
    }

#if 0
    /* Specify the multicast group */
    multicastRequest.imr_multiaddr.s_addr = inet_addr(multicastIP);

    /* Accept multicast from any interface */
    multicastRequest.imr_interface.s_addr = htonl(INADDR_ANY);

    /* Join the multicast address */
    //if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&multicastRequest, sizeof(multicastRequest)) < 0)
    result = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&set_option_on, sizeof(set_option_on));
    if (result < 0)
    {
        printf("\n setsockopt() failed");
        perror("    setsockopt  ");
    }

    /* Receive a single datagram from the server */
    while(1)
    {
         if ((recvStringLen = recvfrom(sock, recvString, MAXRECVSTRING, 0, NULL, 0)) < 0)
        {
            printf("\nrecvfrom() failed");
        }
    Sleep(1000);
    }
#else
    strcpy(msg,"default test message");
    struct sockaddr_in address1;
    int len;
    int bytes_sent = -1;
    memset(&address1, 0, sizeof(address1));
    address1.sin_family = AF_INET;  
    address1.sin_port = multicastPort;
    address1.sin_addr.s_addr = inet_addr(multicastIP);
    //msg = "abcdefghijklmnopqrstuvwxyz";
    //socklen_t len;
    //size = strlen(msg);
    if ((recvStringLen = recvfrom(sock, recvString, 1024, 0, (struct sockaddr*)&address1, &len)) < 0)

    {
        printf("\nrecvfrom() failed ");
        perror("    recvfrom  ");
    }else{

    recvString[recvStringLen] = '\0';
    printf("Received: %d bytes %s\n", recvStringLen,recvString);    /* Print the received string */
    perror("    received from  ");
    }

    bytes_sent = sendto(sock,
                            msg,
                            sizeof(msg),
                            0,
                            (struct sockaddr*)&address1,
                            sizeof(address1));
    printf("bytes sent = %d \n", bytes_sent);
    printf("size of msg = %d \n ", sizeof(msg));
    perror(   "sendto  ");
#endif

    getch();

    closesocket(sock);
    WSACleanup();   /* Cleanup Winsock */

    exit(0);
    return 0;

}

當我單步執行操作時,將獲得成功的套接字創建和有效的套接字描述符。 我獲得了成功的綁定,這時執行cmd行netstat -p UDP -a時端口顯示為udp。

setsockopt也會正確完成。

當我逐步執行recvfrom時,它將收到2 ^ 24個字節,所有字節都是相同的-52機器是獨立的,不在網絡上。

recvString長256個字節,但是您的recvFrom()要求最多1024個字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM