使用sendto时参数无效

时间:2012-04-10 12:59:47

标签: c linux networking

我正在尝试通过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");
}

1 个答案:

答案 0 :(得分:2)

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

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


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