第三章-套接字接口编程简介

//自己学习笔记和摘录,留着以后看

  前言:网络编程要涉及的那就是socket API,不少书只对一些API做了一些简单的阐述和说明,对于函数中的结构体确没有说的特别详细,这本书就比较详细。所谓知其然,知其所以然,看懂了一些底层细节的东西,coding相对也会比较轻松。做为小白的我觉得应该就是这个理。第三章基本就是一些结构体、转换函数的介绍。

1.Socket Address Structures

//结构体in_addr 存放32-bit的IPv4地址

View Code
1 struct in_addr {
2   in_addr_t   s_addr;           /* 32-bit IPv4 address */
3                                 /* network byte ordered */
4 };

//结构体sockaddr_in 存储protocol和port等,该结构体中包含了上述的in_addr结构体 在<netinet/in.h>头文件中定义

View Code
1 struct sockaddr_in {
2   uint8_t         sin_len;      /* length of structure (16) */
3   sa_family_t     sin_family;   /* AF_INET */
4   in_port_t       sin_port;     /* 16-bit TCP or UDP port number */
5                                 /* network byte ordered */
6   struct in_addr  sin_addr;     /* 32-bit IPv4 address */
7                                 /* network byte ordered */
8   char            sin_zero[8];  /* unused */
9 };

 sockaddr_in结构体成员说明

  •  长度成员sin_len,无需设置、检查,除非涉及到路由套接口(17章) //没碰到过 不懂??
  • sin_zero成员暂不使用,总设置为0  //做为预留??

通用套接口地址结构sockaddr<sys/socket.h>中定义

//socket 地址结构是通过指针传递的,为了能处理所有协议族的套接口地址结构,所以定义了一个sockaddr结构体将所有传递进来的套接口地址结构强制转换成sockaddr类型,下面bind函数的第二个参数就是将sockaddr_in结构体类型强制转换成了sockaddr通用类型。ps:以前写socket程序时对这个参数的理解一直云里雾里,现在看了才恍然大悟,搜碟四内...

1 bind(sockfd, (struct sockaddr *) &serv, sizeof(serv));
View Code
1 struct sockaddr {
2   uint8_t      sa_len;
3   sa_family_t  sa_family;    /* address family: AF_xxx value */
4   char         sa_data[14];  /* protocol-specific address */
5 };

IPv6的结构先搁置.....

2.字节操作函数

  • 第一组函数,以字母b开头,起源于4.2BSD(Berkeley Software Distribution)支持几乎所有的系统
  • 第二组函数,以mem打头,起源ANSI C标准,支持ANSI C库的系统
  • //能否这样理解? 类似bzero的第一类函数能在window下跑,而mem打头的不能在linux跑???
View Code
1 #include <strings.h>
2 void bzero(void *dest, size_t nbytes);
3 void bcopy(const void *src, void *dest, size_t nbytes);
4 int bcmp(const void *ptr1, const void *ptr2, size_t nbytes);
5 Returns: 0 if equal, nonzero if unequal
6  
View Code
1 #include <string.h>
2 void *memset(void *dest, int c, size_t len);
3 void *memcpy(void *dest, const void *src, size_t nbytes);
4 int memcmp(const void *ptr1, const void *ptr2, size_t nbytes);
5 Returns: 0 if equal, <0 or >0 if unequal
6  

 

posted @ 2013-01-11 20:01  hellowlf  阅读(231)  评论(0)    收藏  举报