sendto 中的参数无效

Posted

技术标签:

【中文标题】sendto 中的参数无效【英文标题】:Invalid argument in sendto 【发布时间】:2015-02-16 01:29:28 【问题描述】:

我有两个相互通信的程序。

客户端:先发送消息,然后监听回复。 服务器:监听回复,然后发送消息。

我能够完美地从客户端发送消息并在服务器上监听。但是当我尝试从服务器发送消息时出现问题。

struct hostent *gethostbyname();
typedef struct Message 
    unsigned int length;
    unsigned char data[SIZE];
 Message;

typedef struct sockaddr_in SocketAddress;
int fileDesc;
int aLength;

void main(int argc, char **argv) 
    Message callMsg, rep;
    aLength = 0;

    SocketAddress clientSAMain, serverSAMain;

    int port = RECIPIENT_PORT;

    if ((fileDesc = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
        perror("socket failed");
        //return BAD;
    
    makeReceiverSA(&serverSAMain, port);

    if (bind(fileDesc, (struct sockaddr *) &serverSAMain,
            sizeof(struct sockaddr_in)) != 0) 
        perror("Bind failed\n");
        close(fileDesc);
        //return BAD;
    

    clientSAMain.sin_family = AF_INET;
    aLength = sizeof(serverSAMain);
    GetRequest(&callMsg, port, &clientSAMain);

    SendReply(&rep, port, clientSAMain);
    close(fileDesc);



void GetRequest(Message *callMessage, int s, SocketAddress *clientSA) 
    //SocketAddress serverSA;

    int n;
    int i;

    if ((n = recvfrom(fileDesc, callMessage->data, SIZE, 0,
            (struct sockaddr *) &clientSA, &aLength)) < 0)
        perror("Receive 1");
    else

        printf("\n Received Message:(%s)length = %d \n", callMessage->data, n);






void SendReply(Message *replyMessage, int s, SocketAddress clientSANew) 

printf("Enter a reply:");
scanf("%s", replyMessage->data);

if ((n = sendto(fileDesc, replyMessage->data, sizeof(replyMessage->data), 0,
        (struct sockaddr *) &clientSANew, sizeof(struct sockaddr_in))) < 0)
    perror("Send Failed in Server\n");

if (n != strlen(replyMessage->data))
    printf("sent %d\n", n + 1);



/* make a socket address using any of the addressses of this computer
 for a local socket on given port */
void makeReceiverSA(struct sockaddr_in *sa, int port) 
sa->sin_family = AF_INET;
sa->sin_port = htons(port);
sa->sin_addr.s_addr = htonl(INADDR_ANY);

//如果我将 sendreply 函数代码放在 GetRequest 函数中,它工作正常。谁能帮我这个。我一直在尝试所有可能的方法,但没有找到解决方案。对我来说正在进行中的工作,如果这是愚蠢的问题,请原谅我。

PS:编辑掉所有不必要的代码。

【问题讨论】:

您是否收到编译错误?有什么问题? 抱歉文中未提及的错误。我已经在标题中提到了。 来自手册页:recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); 需要一个指针而不是指针的地址,您为什么在 GetRequest 中这样做? recvfrom(fileDesc, callMessage-&gt;data, SIZE, 0, (struct sockaddr *) &amp;clientSA, &amp;aLength)) clientSA 是函数参数中的指针 getRequest 函数有效吗? 对此感到抱歉,感谢您指出。如果我在凌晨 3 点编码会发生这种情况:( 所以你的标题应该是“recvfrom() 中的无效参数”? 【参考方案1】:
recvfrom(fileDesc, callMessage->data, SIZE, 0,
         (struct sockaddr *) &clientSA, &aLength)

因为clientSA是一个指针,上面会覆盖指针变量和它后面的内存。上述调用中的&amp;clientSA 应为clientSA

【讨论】:

谢谢你会试试这个:) ...我是怎么想念它的:(

以上是关于sendto 中的参数无效的主要内容,如果未能解决你的问题,请参考以下文章

发送到:无效参数错误

发送到错误:无效的参数

python中的原始套接字和sendto

将cookie添加到chromedriver时如何修复Selenium中的“无效参数:无效'到期'”?

lsmeans 模型中的参数无效?

MySQL JSON 查询:参数 1 中的 JSON 文本无效