Linux Socket関連関数のメモ

2589 ワード

【以下、基本的に転載】
1、構造体struct sockaddr,struct sockaddr_in,  struct in_addr
ユニバーサルソケットデータ接合
struct sockaddr {
unsigned short sa_family;  /*    , AF_xxx */
char sa_data[14];  /* 14       */
};

実際に使用されているソケットデータ構造は、タイプ変換を行うことができます.
struct sockaddr_in {
short int sin_family; /*     */
unsigned short int sin_port; /*     */
struct in_addr sin_addr; /* Internet   */
unsigned char sin_zero[8]; /*  struct sockaddr      */
};

IPアドレスのデータ構造:
struct in_addr {
unsigned long s_addr;
};

2、バイト順変換関数

#include <arpa/inet.h>

uint32_t htonl (uint32_t hostlong)     //                 
uint16_t htons (uint16_t hostshort)       //                 
uint32_t ntohl (uint32_t netlong)      //                 
uint16_t ntohs(uint16_t netshort)      //                 

3、文字転送IPアドレスとバイナリIPアドレスの変換

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int inet_aton (const char *str, struct in_addr *addr)   //       in_addr 
in_addr inet_addr (const char *str)  //       in_addr 
char *inet_ntoa (struct in_addr addr)  // in_addr            

2つの更新関数inet_ptonとinet_ntop、この2つの関数はipv 4とipv 6を処理することができ、原型は以下の通りである.
int inet_pton(int af, const char *src, void *dst)

この関数は文字列をネットワークアドレスに変換し,最初のパラメータafはアドレスファミリーであり,変換後にdstに存在する.
inet_ptonはinet_addrの拡張、サポートされているマルチアドレスファミリーは以下のとおりです.
AF_INET:srcは文字型のアドレス、すなわちASCIIのアドレスを指すヘッダアドレス(ddd.ddd.ddd.ddd.dddフォーマット)であり、関数はこのアドレスをin_に変換するaddrの構造体を*dstにコピー
AF_INET 6:rcはIPV 6を指すアドレスであり、関数はこのアドレスをin 6_に変換するaddrの構造体を*dstにコピー
関数エラーが負の値を返し、errnoがEAFNOSUPPORTに設定されている場合、パラメータafで指定されたアドレスファミリーとsrcフォーマットが間違っている場合、関数は0を返します.
関数inet_ntopの逆変換プロトタイプは以下の通りである.
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)

この関数はネットワークバイナリ構造をASCIIタイプのアドレスに変換し,パラメータの役割は上と同じで,ただ1つのパラメータが増えただけである.
4、一般的な使い方は次のとおりです.
int sockfd;
struct sockaddr_in my_addr;

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
 perror("socket");
 exit(1);
}

bzero(&my_addr, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(port);
my_addr.sin_addr.s_addr = inet_addr("192.168.1.3");