[分享] 如何取得一個socket的local port number

作者: mycallmax (阿冠)   2009-05-11 12:49:01
//在單班Project2中會用到
//要回傳給Server自己的IP和所使用的Port number
//但由於我們習慣建好socket之後就直接connection
//讓connect()自己幫我們找到一個free的port number來bind上去
//所以我們就必須利用getsockname()這個function
//來查詢某個socket的local port number
上面是我誤解project2在login時要傳送的port的講法,請大家忽略
真正的是要開一個socket並且bind一個port來listen所有欲傳送檔案的人的連線
所以沒有以上的問題,是我搞錯了
使用方法:
#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *len);
int getpeername(int sockfd, struct sockaddr *addr, socklen_t *len);
這兩個function是一對的,getsockname()可以取得local address和local port number
而getpeername()可以取得remote address和remote port number
sockfd: file descriptor of the socket
addr: 和connection時要使用的structure一樣
len: the size of the struct sockaddr
Return value: 0 if OK, -1 on error
Example:
//假設我們已經有一個建立好連線的socket,名為sockfd
#include <sys/socket.h> //for those two function
#include <netinet/in.h> //for struct sockaddr_in
struct sockaddr_in local_sockaddr, remote_sockaddr;
socklen_t len;
len=sizeof(struct sockaddr_in);
if(getsockname(sockfd, &local_sockaddr, &len)==-1) {
perror("getsockname");
}
if(getpeername(sockfd, &remote_sockaddr, &len)==-1) {
perror("getpeername");
}
詳細內容可參照系程課本p562

Links booklink

Contact Us: admin [ a t ] ucptt.com