首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sendto时参数无效

使用sendto时参数无效
EN

Stack Overflow用户
提问于 2012-04-10 20:59:47
回答 1查看 8.6K关注 0票数 1

我试图在C中通过UDP套接字发送一个缓冲区,但在sendto中总是得到一个无效参数错误。我就是找不到错误。谁能帮帮我。提前谢谢。

下面是我的代码:

代码语言:javascript
复制
/**/    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");
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-10 21:03:07

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

代码语言:javascript
复制
void IPCSend(char *pazClientAddress, int iClientPort, char *pazBuffer, size_t len)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10089288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档