getsockname

getsockname()和getpeername()

非 Y 不嫁゛ 提交于 2020-03-06 04:38:36
对于server端: 以端口为通配符方式bind:对于服务器,bind(0,ip),则调用bind函数之后,就可以调用getsockname获取服务器得到的本地端口号 以ip地址为通配地址bind,只有accept返回之后,调用getsockname(connfd,......)才会返回服务器得到的本地ip地址 对于client端: 由于不绑定bind,所以当connect()函数成功之后(完成三次握手),可以调用getsockname可以得到本地端口号和ip地址 getpeername(): server调用accept()之后,再调用exec,要获取客服端的套接字地址结构,只能通过调用 getpeername(connfd, ( struct sockaddr *)&peerAddr, &peerLen); 来源: https://www.cnblogs.com/kkshaq/p/4600771.html

getsockname和getpeername函数

爱⌒轻易说出口 提交于 2020-03-06 04:38:03
#include <sys/socket.h> int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlrn); int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen); 返回:成功返回0,出错则为-1 1、函数用途   getsockname:获取与某个套接字关联的 本地 协议地址   getpeername:获取与某个套接字关联的 外地 协议地址 2、需要这两个函数的原因   (1) 在一个没有调用bind的TCP客户上,connect成功后,getsockname用于获取由内核赋予该连接的本地IP地址和本地端口号;   (2) 在以端口号0调用bind(告知内核去选择本地端口号)后,getsockname用于获取由内核赋予的本地端口号;   (3) getsockname可以用于获取某个套接字的地址族  int sockfd_to_family(int sockfd) { struct sockaddr_storage ss; socklen_t len; len = sizeof(ss); if (getsockname(sockfd, (SA *) &ss , &len) < 0) {

TCP套接字函数

无人久伴 提交于 2020-02-26 10:59:34
1. socket函数 # include <sys/socket.h> int socket ( int family , int type , int protocol ) ; //若成功则返回非负描述符 //若出错返回-1 2.connect函数 # include <sys/socket.h> int connect ( int sockfd , const struct sockaddr * servaddr , socklen_t addrlen ) ; //若成功则返回0,出错返回-1 第二个参数是一个指向套接字地址结构的指针。 客户再调用函数connect前不必非得调用bind函数。 调用connect函数将激发TCP的三路握手,而且仅在 连接建立成功或出错时 才返回。 出错情况: (1)TCP客户端没有收到SYN分节的响应,返回ETIMEDOUT (2)若对SYN的响应为RST,表明服务器在指定端口没有进程在等待连接。 (3)SYN在中间某个路由器引发“目的地不可达”的ICMP错误。 若connect失败则该套接字不再可用,必须关闭。 3.bind函数 # include <sys/socket.h> int bind ( int sockfd , const struct sockaddr * myaddr , aocklen_t addrlen ) ; /

UNIX网络编程——getsockname和getpeername函数

丶灬走出姿态 提交于 2020-02-02 20:40:12
这两个函数或者返回与某个套接字关联的 本地协议地址 (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,失败则为-1 getpeername只有在连接建立以后才调用 ,否则不能正确获得对方地址和端口,所以它的参数描述字一般是 已连接描述字而非监听套接口描述字。 没有连接的UDP不能调用getpeername,但是可以调用getsockname和TCP一样,它的地址和端口不是在调用socket就指定了,而是在第一次调用sendto函数以后。 已经连接的UDP,在调用connect以后,这2个函数(getsockname,getpeername)都是可以用的。但是这时意义不大,因为已经连接(connect)的UDP已经知道对方的地址。 需要这两个函数的理由如下: 在一个没有调用bind的 TCP客户 上, connect成功返回后