简体   繁体   English

UDP多播接收2 ^ 24字节的数据,这应该是不可能的

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

have a stand alone PC running VS6 on WinXP - yes ancient technology. 在WinXP上有一台运行VS6的独立PC-是古老的技术。 I am porting a C code app from Linux. 我正在从Linux移植C代码应用程序。 Stuck on multicast problem 卡在多播问题上

 #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;

}

When I single step through, I get a successful socket creation and valid socket descriptor. 当我单步执行操作时,将获得成功的套接字创建和有效的套接字描述符。 I get a successful bind, at which point the port shows up as udp when I do a cmd line netstat -p UDP -a 我获得了成功的绑定,这时执行cmd行netstat -p UDP -a时端口显示为udp。

setsockopt also completes without error. setsockopt也会正确完成。

When I step through the recvfrom it receives 2^24 bytes all of which are the same -52 The machine is stand alone, not on a network. 当我逐步执行recvfrom时,它将收到2 ^ 24个字节,所有字节都是相同的-52机器是独立的,不在网络上。

recvString长256个字节,但是您的recvFrom()要求最多1024个字节。

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

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