zoukankan      html  css  js  c++  java
  • getpeername

    定义:
    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))
    {
        printf( "对方IP:%s ", inet_ntoa(sa.sin_addr));
        printf( "对方PORT:%d ", ntohs(sa.sin_port));
    }
    补充:getsockname和getpeername调度时机很重要,如果调用时机不对,则无法正确获得地址和端口。
    TCP
    对于服务器来说,在bind以后就可以调用getsockname来获取本地地址和端口,虽然这没有什么太多的意义。getpeername只有在链接建立以后才调用,否则不能正确获得对方地址和端口,所以他的参数描述字一般是链接描述字而非监听套接口描述字。
    对于客户端来说,在调用socket时候内核还不会分配IP和端口,此时调用getsockname不会获得正确的端口和地址(当然链接没建立更不可能调用getpeername),当然如果调用了bind 以后可以使用getsockname。想要正确的到对方地址(一般客户端不需要这个功能),则必须在链接建立以后,同样链接建立以后,此时客户端地址和端口就已经被指定,此时是调用getsockname的时机。
    UDP
    UDP分为链接和没有链接2种(这个到UDP与connect可以找到相关内容)
    没有链接的UDP不能调用getpeername,但是可以调用getsockname,和TCP一样,他的地址和端口不是在调用socket就指定了,而是在第一次调用sendto函数以后
    已经链接的UDP,在调用connect以后,这2个函数都是可以用的(同样,getpeername也没太大意义。如果你不知道对方的地址和端口,不可能会调用connect)。
  • 相关阅读:
    iOS开发App上传的三大步骤
    iOS开发关于AppStore程序的上传流程
    AFNetworking 3.0x版本最新特性
    iOS开发中两个不错的宏定义
    iOS开发中NSDate时间戳的转换--
    HDU 2844 Coins 多重背包
    poj 1888 Crossword Answers 模拟题
    杭电oj 1069 Monkey and Banana 最长递增子序列
    郑轻校赛题目 问题 G: 多少个0
    HDU 2571 命运
  • 原文地址:https://www.cnblogs.com/Daniel-G/p/3243111.html
Copyright © 2011-2022 走看看