UNIX網路程式設計學習(9)--getsockname和getpeername的用法及例項
getsockname和getpeername
#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);
int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);
返回:0—OK,-1—出錯。
getsockname函式返回與套介面關聯的本地協議地址。
getpeername函式返回與套介面關聯的遠端協議地址。
addrlen是值-結果引數。
使用場合:
- 在不呼叫bind的TCP客戶,當connect成功返回後,getsockname返回分配給此連線的本地IP地址和本地埠號;
- 在以埠號為0呼叫bind後,使用getsockname返回核心分配的本地埠號;
- getsockname可用來獲取某套介面的地址族;
- 在捆綁了通配IP地址的TCP伺服器上,當連線建立後,可以使用getsockname獲得分配給此連線的本地IP地址;
- 當一個伺服器呼叫exec啟動後,他獲得客戶身份的唯一途徑是呼叫getpeername函式。
伺服器端原始碼:
#include "unp.h"
int
main(int argc, char ** argv)
{
int listenfd,connfd;
struct sockaddr_in servaddr;
pid_t pid;
char temp[20];
listenfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(10010);
Bind(listenfd, (SA *)&servaddr, sizeof(servaddr));
Listen(listenfd, LISTENQ);
for( ; ; )
{
struct sockaddr_in local;
connfd = Accept(listenfd, (SA *)NULL, NULL);
if((pid = fork()) == 0)
{
Close(listenfd);struct sockaddr_in serv, guest;
char serv_ip[20];
char guest_ip[20];
socklen_t serv_len = sizeof(serv);
socklen_t guest_len = sizeof(guest);
getsockname(connfd, (struct sockaddr *)&serv, &serv_len);
getpeername(connfd, (struct sockaddr *)&guest, &guest_len);
Inet_ntop(AF_INET, &serv.sin_addr, serv_ip, sizeof(serv_ip));
Inet_ntop(AF_INET, &guest.sin_addr, guest_ip, sizeof(guest_ip));
printf("host %s:%d guest %s:%d\n", serv_ip, ntohs(serv.sin_port), guest_ip, ntohs(guest.sin_port));
char buf[] = "hello world";
Write(connfd, buf, strlen(buf));
Close(connfd);
exit(0);
}
Close(connfd);
}
}
客戶端原始碼:
#include "unp.h"
#define DEST_IP "127.0.0.1"
int
main(int argc, char ** argv)
{
int sockfd, n;
char buf[100];
char serv_ip[20], guest_ip[20];
struct sockaddr_in servaddr;
sockfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(10010);
Inet_pton(AF_INET, DEST_IP, &servaddr.sin_addr);
Connect(sockfd, (SA *)&servaddr, sizeof(servaddr));
struct sockaddr_in serv, guest;
socklen_t serv_len = sizeof(serv);
socklen_t guest_len = sizeof(guest);
getsockname(sockfd, (SA *)&guest, &guest_len);
getpeername(sockfd, (SA *)&serv, &serv_len);
Inet_ntop(AF_INET, &guest.sin_addr, guest_ip, sizeof(guest_ip));
Inet_ntop(AF_INET, &serv.sin_addr, serv_ip, sizeof(serv_ip));
printf("host %s:%d, guest %s:%d\n", serv_ip, ntohs(serv.sin_port), guest_ip, ntohs(guest.sin_port));
n = Read(sockfd, buf, 100);
buf[n] = '\0';
printf("%s\n", buf);
Close(sockfd);
exit(0);
}
TCP
對於伺服器來說,在bind以後就可以呼叫getsockname來獲取本地地址和埠,雖然這沒有什麼太多的意義。getpeername只有在連結建立以後才呼叫,否則不能正確獲得對方地址和埠,所以他的引數描述字一般是連結描述字而非監聽套介面描述字。
對於客戶端來說,在呼叫socket時候核心還不會分配IP和埠,此時呼叫getsockname不會獲得正確的埠和地址(當然連結沒建立更不可能呼叫getpeername),當然如果呼叫了bind 以後可以使用getsockname。想要正確的到對方地址(一般客戶端不需要這個功能),則必須在連結建立以後,同樣連結建立以後,此時客戶端地址和埠就已經被指定,此時是呼叫getsockname的時機。
相關文章
- UNIX網路程式設計學習(15)--使用單程式和select的TCP伺服器程式程式設計TCP伺服器
- [.net 物件導向程式設計基礎] (9) 類和類的例項物件程式設計
- UNIX網路程式設計學習(16)--使用poll的TCP伺服器程式程式設計TCP伺服器
- UNIX網路程式設計學習(4)--值-結果引數程式設計
- UNIX網路程式設計學習(12)--對兩個數求和的str_echo函式-以及sscanf的用法程式設計函式
- Unix哲學(Unix程式設計藝術)程式設計
- Unix程式設計藝術,Unix哲學程式設計
- Spark程式設計環境搭建及WordCount例項Spark程式設計
- 【LINUX 學習】使用find和xargs[轉摘自《shell程式設計和unix命令》]Linux程式設計
- UNIX網路程式設計學習(17)--檢查套接字選項是否受支援並獲取預設值程式設計
- 網路測速一原理及例項
- C++學習隨筆——簡單的單例設計模式例項C++單例設計模式
- JS中排序的用法和例項JS排序
- 《Unix 網路程式設計》15:Unix 域協議程式設計協議
- Linux學習路線及網路程式設計經典書籍(轉載)Linux程式設計
- UNIX網路程式設計學習(3)--簡單時間獲取伺服器程式程式設計伺服器
- UNIX網路程式設計學習(18)--UDP回射(伺服器+客戶端)程式程式設計UDP伺服器客戶端
- emca和emctl的日常用法及例項(經驗儲存)
- UNIX 網路程式設計學習(7)--readn,writen,readline的實現程式設計
- 《UNIX網路程式設計》筆記 - select和poll程式設計筆記
- 《Unix 網路程式設計》11:名字和地址轉換程式設計
- Python學習:類和例項Python
- ios網路學習------9 播放網路視訊iOS
- Jmeter beanshell程式設計例項JMeterBean程式設計
- 設計模式例項程式碼設計模式
- KafKa Java程式設計例項KafkaJava程式設計
- 最簡潔的PHP程式設計師學習路線及建議PHP程式設計師
- js的建構函式和原型用法程式碼例項JS函式原型
- 網路爬蟲筆記2, requests庫入門-2(程式設計例項)爬蟲筆記程式設計
- javascript this用法和簡單例項JavaScript單例
- 反面教材,這9個糟糕的網頁設計例項引以為戒網頁
- UNIX網路程式設計學習(8)--伺服器端顯示客戶端的IP地址和埠號程式設計伺服器客戶端
- 《UNIX網路程式設計》筆記 - 套接字選項/UDP套接字程式設計筆記UDP
- UNIX網路程式設計學習(1)--開啟ubuntu daytime服務程式設計Ubuntu
- CSS RGBA的用法程式碼例項CSS
- Excel isna函式的用法和例項Excel函式
- UNIX網路程式設計學習(13)--使用select的str_cli函式的實現程式設計函式
- 新Rust程式設計師需要學習的9個功能Rust程式設計師