5

ソケットを使用してCで簡単なメッセージングアプリケーションを作成しています。関数を使用するrecvfromと、それが返され、どちらが(最後に印刷している)であるかが-1設定されます。errno = 14Bad address

奇妙なことに、それでもソケットから読み取り、正しいメッセージを取得します。つまり、アプリケーションは完全に機能しており、そのエラーを除いて期待どおりに機能しています。

私の質問はこれです:なぜ私がこのエラーを受け取っていると思いますか?理由は思いつかない。inet_pton設定に使用してpeer->sin_addrいましたが、同じエラーが発生していました。

// socket file descriptor to send data through
int recv_sock_fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

// fill in the peer's address, loopback in this case
struct sockaddr_in *peer = malloc(sizeof(struct sockaddr_in));
peer->sin_family = AF_INET;
peer->sin_port   = htons(11110);
char *new = &(peer->sin_addr);
new[0] = 127;
new[1] = 0;
new[2] = 0;
new[3] = 1;
for (int i = 0; i < 8; i++) {
    peer->sin_zero[i] = NULL;
}

bind(recv_sock_fd, peer, sizeof(struct sockaddr_in)); 

// check to see if the socket has any data...code removed

char buff[32] = {0};
errno = 0;
int bytes_received = recvfrom(recv_sock_fd, buff, sizeof(buff), NULL, (struct sockaddr *)peer, sizeof(struct sockaddr_in));

printf("Bytes recieved: %d: %d : %s\n", bytes_received, errno, strerror(errno));
4

1 に答える 1

7

の署名を見てくださいrecvfrom(2)

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                 struct sockaddr *src_addr, socklen_t *addrlen);

最後の引数はアドレスですが、単純な整数を指定しています。

次に、IPアドレスの構築が間違っています。使用してくださいinet_pton(3)、それが目的です。の戻り値も確認してくださいbind(2)。間違いなく失敗しています。

于 2011-11-30T02:19:13.457 に答える