通過網路socket獲取對方 ip 和port

2021-06-21 04:14:54 字數 1329 閱讀 5915

定義

int getpeername(int s, struct sockaddr *name, socklen_t *namelen);

描述獲取

socket的對方位址

struct sockaddr_in sa;

int len = sizeof(sa);

if(!getpeername(sockfd, (struct sockaddr *)&sa, &len))

補充:getsockname和getpeername排程時機很重要,如果呼叫時機不對,則無法正確獲得位址和埠。

tcp對於伺服器來說,在bind以後就可以呼叫getsockname來獲取本地位址和埠,雖然這沒有什麼太多的意義。getpeername只有在鏈結建立以後才呼叫,否則不能正確獲得對方位址和埠,所以他的引數描述字一般是鏈結描述字而非監聽套介面描述字。

對於客戶端來說,在呼叫socket時候核心還不會分配ip和埠,此時呼叫getsockname不會獲得正確的埠和位址(當然鏈結沒建立更不可能呼叫getpeername),當然如果呼叫了bind 以後可以使用getsockname。想要正確的到對方位址(一般客戶端不需要這個功能),則必須在鏈結建立以後,同樣鏈結建立以後,此時客戶端位址和埠就已經被指定,此時是呼叫getpeername的時機。

udp

沒有鏈結的udp不能呼叫getpeername,但是可以呼叫getsockname,和tcp一樣,他的位址和埠不是在呼叫socket就指定了,而是在第一次呼叫sendto函式以後

已經鏈結的udp,在呼叫connect以後,這2個函式都是可以用的(同樣,getpeername也沒太大意義。如果你不知道對方的位址和埠,不可能會呼叫connect)。

//獲取fd對應的ip和port

static void get_peer_ip_port(int fd, char **ip, int *port)

// ip v4 or v6

char *buf = malloc(inet6_addrstrlen);

memset(buf, 0, inet6_addrstrlen);

if((inet_ntop(addr.sin_family, &addr.sin_addr, buf, inet6_addrstrlen)) == null)

*port = ntohs(addr.sin_port);

fprintf(stdout, "get peer ip of client ip=%s, port=%d, fd=%d\n", buf, *port, client_fd);

*ip = buf;

return;

}

通過socket來通訊485轉網路

socket來通訊485轉網路 這是乙個通過socket來通訊硬體的方法,抓取硬體傳來的資料進行輸入,並且實時資料傳輸。第一次寫部落格直接就放 了。static string responsemsg private string sendandreceive string ip,int port,s...

Jquery選擇器 通過class名獲取ID

記錄一下自己不太熟悉的jquery選擇器的用法。按 class 查詢注意在 class 名稱前加乙個.var a red 所有節點包含 class red 都將返回 例如 red green red 查詢同時包含多個class名的物件,如同時包含 car 和 bus var a car.bus 注意...

Volley 庫通過網路獲取 JSON 資料

1.通過volley的newrequestqueue context context 方法初始化requestqueue物件 2.定義乙個json資料的字串網路位址 可用的json介面 3.根據volley提供的jsonobjectrequest int method,string url,json...