1

我试图通过 C 中的 UDP 套接字发送缓冲区,但我总是在 sendto 中收到无效参数错误。我只是没有找到错误。任何人都可以帮助我。提前致谢。

这是我的代码:

/**/    void    IPCSend(char *pazClientAddress, int iClientPort, char *pazBuffer )
{
    int iSocket;
    /* */
    if ((iSocket = socket(AF_INET, SOCK_DGRAM, 0)) != -1)
    {
        int iSendToReturn;
        struct sockaddr_in sinServerAddress;
        struct hostent *pstHost;
        /* */
        pstHost = (struct hostent *)gethostbyname((char *)pazClientAddress);
        /* */
        sinServerAddress.sin_family = AF_INET;
        sinServerAddress.sin_addr = *((struct in_addr *)pstHost->h_addr);
        sinServerAddress.sin_port = iPortNumber;
        bzero(&(sinServerAddress.sin_zero),8);
        /* */
        fprintf(stdout,"sending '%s' to client '%s:%d'\n",pazBuffer,pazClientAddress,iClientPort);
        iSendToReturn = sendto(iSocket, pazBuffer, sizeof(pazBuffer), 0, (struct sockaddr *)&sinServerAddress, sizeof(sinServerAddress));
        /* */
        if(iSendToReturn != -1)
            fprintf(stdout,"%d bytes sent\n",iSendToReturn);
        else
            perror("SendTo");
        /* */
        close(iSocket);
    }
    else
        fprintf(stdout,"could not connect to server\n");
}
4

1 回答 1

2

首先,您犯了新手 C 程序员常犯的错误:使用sizeof来获取指针的大小。变量pazBuffer指针,而不是数组,因此sizeof运算符不会返回数组长度,这正是您想要的。您的IPCSend函数需要将长度pazBuffer作为单独的参数:

void IPCSend(char *pazClientAddress, int iClientPort, char *pazBuffer, size_t len)


至于你得到的错误 - 它可能与其他东西有关。Invalid argument意味着您传递给的参数之一在sendto某种程度上是无效的。由于我看到您正在正确初始化套接字描述符,因此问题可能是发送缓冲区在某种程度上无效 - 可能是空指针或错误地址。这意味着问题在您发布的代码中并不明显,并且可能在某些调用IPCSend.

于 2012-04-10T13:03:06.590 回答