![](/img/trans.png)
[英]recvfrom: Bad address, sendto: Address family not supported by protocol
[英]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'.
接收到的緩沖區的格式正確,但是地址顯然錯誤。 為什么? 它與函數外部的地址變量的定義有關嗎?
如果在cliaddr
的memset
之后也添加了這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.