unix网络编程之套接字编程简介

来源:互联网 发布:软件图片处理 编辑:程序博客网 时间:2024/05/17 03:03

一   套接字地址结构

大多数套接字函数都需要一个指向套接字地址结构的指针作为参数。

1.IPV4套接字地址结构(网际套接字地址结构),以sockaddr_in命名。头文件:<netinet/in.h>,长度最少16字节。

POSIX定义:

struct in_addr{

   in_addr_t      s_addr;

};

struct sockaddr_in {

   uint8_t              sin_len;          /*length of structure(16)*/

   sa_family_t       sin_family;     /*AF_INET */

   in_port_t           sin_port;        /*16bit的TCP或UDP端口号*/

   struct in_addr   sin_addr;       /*32bit  IPV4 address */

   char                  sin_zero[8];   /* unused */

};

in_addr_t  IPV4地址,一般为uint32_t;

in_port_t   TCP或者UDP端口,一般为uint16_t


2 字节排序函数

小端字节序:低序字节存储在起始地址。

大端字节序:高序字节存储在起始地址。

主机字节序(host byte order)

网络字节序(network byte order)(大多数是大端字节序)


主机字节序和网络字节序之间转换函数:
#include <netinet/in.h>

uint16_t  htons(uint16_t   host16bitvalue);

uint32_t  htonl(uint32_t    host32bitvalue); 均返回网络字节序的值

uint16_t  ntohs(uint16_t   net16bitvalue);

uint32_t  ntohl(uint32_t    net32bitvalue);均返回主机字节序的值

h:host   n:network  s:short   l:long


3字节操纵函数

#include <string.h>

void        bzero(void *dest,size_t nbytes);

void        bcopy(const void *src,void *dest,size_t nbytes);

int           bcmp(const void *ptrl,const void *ptr2,size_t nbytes);若相等返回0;

bzero把目标字节串指定数目的字节置0,常用此函数把一个套接字地址结构初始化为0(目标字节串是void*指针)。

bcopy将指定数目的字节从源字节移到目标字串。

bcmp比较两个任意的字节串。


#include <string.h>

void   *memset(void *dest,int c,size_t len);

void   *memcpy(void *dest,const void *src,size_t nbytes);

int       memcmp(const void *ptr1,const void *ptr2,size_t nbytes);

memset将目标字串指定数目的字节置为c。

memcpy类似bcopy,当源与目标字节串重叠时,bcopy能正确处理,memcpy不能。


4 地址转换函数

在ASCII字符串与网络字节序的二进制值转换(如192.168.1.1转换为二进制数)


#include <arpa/inet.h>   

int              inet_aton(const char *str,struct in_addr *add);返回:若字符串有效返回1,否则返回0

in_addr_t   inet_addr(const char *str);已废弃

char          *inet_ntoa(struct in_addr inaddr);返回:指向一个点分十进制数串的指针

inet_aton将str所指向的C字符串转换为一个32位的网络字节序二进制值,并存储在add指向的单元;

inet_ntoa将一个32位的网络字节序二进制值转换为相应的点分十进制数串,值得注意的是该函数是以结构为参数而不是指针。

(以上只适用于IPV4)


#include <arpa/inet.h>

int               inet_pton(int family,const char *str,void *add);

const char *inet_ntop(int family,const void *add,char *str,size_t len);

family参数:AF_INET或者AF_INET6。

inet_pton将str所指向的字符串转换为二进制地址并存储在add所指中。

inet_ntop进行相反的操作,len参数是目标存储单元的大小,以免该函数溢出其调用者的缓冲区:

#define INET_ADDRSTRLEN 16

#define INET6_ADDRSTRLEN 46

原创粉丝点击