-2

有一台在 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;

}

当我单步执行时,我获得了成功的套接字创建和有效的套接字描述符。我获得了成功的绑定,此时端口显示为 udp,当我执行 cmd 行 netstat -p UDP -a

setsockopt 也可以正确完成。

当我单步执行 recvfrom 时,它会收到 2^24 个字节,所有这些字节都是相同的 -52 这台机器是独立的,而不是在网络上。

4

1 回答 1

2

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

于 2015-09-29T16:39:39.390 回答