getpeername

[機能]

  ソケットのリモートプロトコルアドレスを返します.成功ならば 0,エラーならば -1 を返します.

[形式]
#include <sys/socket.h>

int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
	sockfd  : ソケットディスクリプタ(接続済みソケット)
	addr    : ソケットアドレス構造体へのポインタ
	addrlen : ソケットアドレス構造体の大きさへのポインタ		

参考1: ソケットアドレス構造体

  構造体
struct sockaddr {
	uint8_t     sa_len;
	sa_family_t sa_family;   // アドレスファミリ( AF_*** )
	char        sa_data[14];   // プロトコル依存
};			
は,ソケットアドレス構造体の総称であり,ソケットアドレスを関数の引数として使用するような場合に使用される.実際上は,以下に示すいずれかが使用される.

  1. IPv4 ソケットアドレス構造体
    #include <netinet/in.h>
    
    struct in_addr {
    	in_addr_t s_addr;   // 32 ビットの IPv4 アドレス
    	                    // ネットワークバイト順序
    };
    
    struct sockaddr_in {
    	uint8_t        sin_len;   // 構造体の大きさ( 16 バイト)
    	sa_family_t    sin_family;   // AF_INET
    	in_port_t      sin_port;   // 16 ビットのポート番号
    	                           // ネットワークバイト順序
    	struct in_addr sin_addr;   // 32 ビット IPv4 アドレス
    	                           // ネットワークバイト順序
    	char           sin_zero[8];   // 未使用
    };
    				
  2. IPv6 ソケットアドレス構造体
    #include <netinet/in.h>
    #define SIN6_LEN
    
    struct in6_addr {
    	uint8_t s6_addr[16];   // 128 ビットの IPv6 アドレス
    	                       // ネットワークバイト順序
    };
    
    struct sockaddr_in6 {
    	uint8_t         sin6_len;   // 構造体の大きさ( 24 バイト)
    	sa_family_t     sin6_family;   // AF_INET6
    	in_port_t       sin6_port;   // トランスポート層ポート番号
    	                             // ネットワークバイト順序
    	uint32_t        sin6_flowinfo;   // 優先度フローラベル
    	                                 // ネットワークバイト順序
    	struct in6_addr sin6_addr;   // IPv6 アドレス
    	                             // ネットワークバイト順序
    };
    				

参考2: Posix.lg のデータ型
データ型 説明 ヘッダ
int8_t 8 ビット符号付き整数 <sys.types.h>
uint8_t 8 ビット符号なし整数 <sys.types.h>
int16_t 16 ビット符号付き整数 <sys.types.h>
uint16_t 16 ビット符号なし整数 <sys.types.h>
int32_t 32 ビット符号付き整数 <sys.types.h>
uint32_t 32 ビット符号なし整数 <sys.types.h>
sa_family_t ソケットアドレス構造体のアドレスファミリ <sys.socket.h>
socklen_t ソケットアドレス構造体の大きさ( uint32_t ) <sys.socket.h>
in_addr_t IPv4 アドレス( uint32_t ) <netinet.in.h>
in_port_t TCP あるいは UDP のポート番号( uint16_t ) <netinet.in.h>

[参照]

getsockname

菅沼ホーム 本文目次 演習問題解答例 付録目次 索引