簡體   English   中英

從recvfrom收到的錯誤地址:為什么?

[英]Bad address received from recvfrom: why?

我正在編寫一個應該執行一些操作的函數,然后返回(使用其參數)與該函數內部的recvfrom交互(即使用sendto )的設備的地址。

這是我調用函數的方式,之前實例化了cliaddr

struct sockaddr_in cliaddr;
memset((void *) &cliaddr, 0, sizeof(cliaddr));
rcv_string(sockfd, &return_string, &cliaddr);
// Here I'll need to use cliaddr, that's why I need it outside too

這是該函數的實現:

int rcv_string(int sockfd, char **return_string, struct sockaddr_in *sndaddr) {
    // ...
    char buff[PACKETSZ + 2];
    memset(&buff, 0, sizeof(buff)); // Clean buffer
    socklen_t *plen = malloc(sizeof(struct sockaddr *));
    if ((recvfrom(sockfd, buff, sizeof(buff), 0, (struct sockaddr *) sndaddr, plen)) < 0) {
            perror("recvfrom");
            return -1;
    }
    char *snd_ip = malloc(INET_ADDRSTRLEN * sizeof(char));
    if (inet_ntop(AF_INET, &((*sndaddr).sin_addr.s_addr), snd_ip, INET_ADDRSTRLEN * sizeof(char)) == NULL) {
            perror("inet_ntop");
            return -1;
    }
    printf("Received '%s' from '%s'.\n", buff, snd_ip);
    // ...
}

現在,即使發送設備的IP地址為192.168.1.251我也會得到以下輸出:

Received '0packetx' from '0.0.0.0'.

接收到的緩沖區的格式正確,但是地址顯然錯誤。 為什么? 它與函數外部的地址變量的定義有關嗎?

編輯

如果在cliaddrmemset之后也添加了這3行:

cliaddr.sin_family = AF_INET;
cliaddr.sin_addr.s_addr = htonl(INADDR_ANY);
cliaddr.sin_port = htons(SERV_PORT);

我得到一個隨機的行為。 有時我得到0.0.0.0 ,有時得到127.0.0.1 ,有時得到正確的地址( 192.168.1.251 )。

您傳遞的長度不正確

  socklen_t *plen = malloc(sizeof(struct sockaddr *));
    if ((recvfrom(sockfd, buff, sizeof(buff), 0, (struct sockaddr *) sndaddr, plen))

為什么malloc是一個謎,但是您需要

socklen_t *plen = malloc(sizeof(socklen_t));
*plen = sizeof(struct sockaddr_in );

更簡單的是

      socklen_t plen = sizeof(struct sockaddr_in);
   if ((recvfrom(sockfd, buff, sizeof(buff), 0, (struct sockaddr *) sndaddr, &plen))

如果用有效的sizeof數據填充plen,它應該可以工作。

*plen = sizeof(struct sockaddr_in);

您可以將其放在recvfrom調用之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM