我試圖將一個ipv6埠系結到一個ipv6套接字。但系結的埠與我指定的不同。
#include <netdb.h>
#include <netinet/tcp.h>/span>
#include <poll.h>/span>
#include <sys/socket.h>/span>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
int main(int argc, char *argv[]) /span> {
int unconnected_sock_ =
socket(PF_INET6, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0) 。
struct sockaddr_in6 addr = {0};
addr.sin6_family = AF_INET6;
addr.sin6_port = atoi(argv[1] )。
addr.sin6_addr = in6addr_any;
if (bind(unconnected_sock_,
(struct sockaddr*)(&addr) 。
sizeof(addr)) != 0) {
fprintf(stderr, " error : %s
", strerror(errno))。
}
struct sockaddr_in6 sin;
socklen_t len = sizeof(sin)。
getsockname(unconnected_sock_, (struct sockaddr *)&sin, & len);
fprintf(stderr, "port number %d
", ntohs(sin.sin6_port) )。
}
output:
ubun - main: ~/socket.exe54682
埠號39637。
uj5u.com熱心網友回復:
請注意,54682是0xd59a,而39637是0x9ad5。這是相同的值,但以不同的位元組順序寫入。
從man ipv6:
sin6_port是協議port (見ip(7) 中的sin_port)。
從man 7 ip:
sin_port 包含網路位元組順序的埠。
在列印與套接字系結的埠的一行中,你將網路位元組順序轉換為本地位元組順序:
fprintf(stderr, "port number %d
", ntohs(sin.sin6_port) )。
在設定請求的埠號的那一行,你沒有將位元組順序從本地轉換為網路順序:
addr.sin6_port = atoi(argv[1] )。
為了得到預期的行為,你應該把它修改為:
addr.sin6_port = htons(atoi(argv[1] )。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/332262.html
標籤:
上一篇:紅寶石-黑客等級問題
下一篇:馬薩諸塞州交通局未能處理作業
