【1】TCP/IP协议
传输控制/网际协议(Transfer Control Protocol/Internet Protocol) 又称作网络通讯协议
TCP(即传输控制协议):是一种面向连接的传输层协议,
【2】网络预备知识
Socket
是一个编程接口
是一种特殊的文件描述符 (everything in Unix is a file)
并不仅限于TCP/IP协议
面向连接 (Transmission Control Protocol - TCP/IP)
无连接 (User Datagram Protocol -UDP 和 Inter-network Packet Exchange - IPX)
IP地址
IP地址是Internet中主机的标识
Internet中的主机要与别的机器通信必须具有一个IP地址
端口号
为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别.
vi /etc/services
TCP端口号与UDP端口号独立
端口号一般由IANA (Internet Assigned Numbers Authority) 管理
众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
已登记端口:1024~49151
动态或私有端口:49152~65535
字节序
0x12345678
不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO):
小端序(little-endian) - 低序字节存储在低地址
将低字节存储在起始地址,称为“Little-Endian”字节序,Intel、AMD等采用的是这种方式;
大端序(big-endian)- 高序字节存储在低地址
将高字节存储在起始地址,称为“Big-Endian”字节序,由ARM、Motorola等所采用
网络字节序是大端字节序。
【3】int socket(int domain, int type, int protocol);
功能:创建一个网络套接字
参数:domain AF_UNIX, AF_LOCAL 本地通信
AF_INET 网络通信
type SOCK_STREAM 进行tcp通信
SOCK_DGRAM 进行udp通信
SOCK_RAW 原始套节字通信
protocol 0 使用系统提供协议
返回值:成功 新的文件描述符
出错 -1
【4】int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:绑定网络信息结构体与套接字
参数:sockfd 网络套接字
addr 网络信息结构体
addrlen 网络信息结构体大小
返回值:成功 0,出错 -1
*************************************************************************
标准通信结构体:
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
*************************************************************************
网络通信结构体:
/* Structure describing an Internet socket address. */
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_); // sa_family_t sin_family;
in_port_t sin_port; /* Port number. */ 端口号
struct in_addr sin_addr; /* Internet address. */ IP地址
/* Pad to size of `struct sockaddr'. */
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
};
-----------------------地址族-----------------------------------------------
#define __SOCKADDR_COMMON(sa_prefix) sa_family_t sa_prefix##family
## 在宏定义中,代表的是字符串的拼接。
typedef unsigned short int sa_family_t;
===》 unsigned short int sin_family;
------------------------端口号------------------------------------------------
in_port_t sin_port;
==》 typedef uint16_t in_port_t;
==》 typedef unsigned short int uint16_t;
-------------------------IP地址------------------------------------------------
struct in_addr sin_addr;
==》
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};
typedef unsigned int uint32_t;
---------- 占位成员,使sockaddr 与 sockaddrin 两个结构体的大小保持一致---------
unsigned char sin_zero[8]; 不填充任何数据,作为占位使用。
【5】转换函数
in_addr_t inet_addr(const char *cp);
功能:将点分十进制的ip字符串,转换为二进制的网络字节序数据。
参数:cp ip字符串
uint16_t htons(uint16_t hostshort);
功能:将无符号短整形主机字节序数据转换为网络字节序数据。
char *inet_ntoa(struct in_addr in);
功能:将网络字节序的二进制数据,转换为 点分十进制的字符串
uint16_t ntohs(uint16_t netshort);
功能:将网络字节序的数据,转换为主机字节序数据
【6】 int listen(int sockfd, int backlog);
功能:将套接字置为被动监听模式,监听请求的到来。
参数:sockfd 网络套接字
backlog 监听队列的大小
返回值:成功 0,出错 -1
【7】int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:接收客户端的连接请求,返回一个新的网络套接字(专门被用来与相对应的客户端进行通信)
参数:sockfd 监听套接字
addr 客户端的网络信息结构体
addrlen 网络信息结构体大小
返回值:成功 一个新的文件描述符
出错 -1
【8】 int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:向服务器发起连接请求
参数:sockfd 网络套接字
addr 服务器网络信息结构体
addrlen 结构体大小
返回值:成功 0,出错 -1
【9】定义追踪
1-- 生成索引文件, /usr/include
sudo ctags -R
2-- vim -t "sockaddr"
3-- ctrl + ] 向下一级追踪
ctrl + t 返回上一级
【10】ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:发送消息
参数:sockfd 网络套接字
buf 要发送的消息的缓存区首地址
len 消息的大小
flags 0 阻塞
返回值:成功 实际发送的字节数
出错 -1
【11】ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:接收消息
参数:sockfd 网络套接字
buf 接收的消息的缓存区首地址
len 消息的大小
flags 0 阻塞
返回值:成功 实际接收到字节数
如果对方关闭,返回值为0
出错 -1
传输控制/网际协议(Transfer Control Protocol/Internet Protocol) 又称作网络通讯协议
TCP(即传输控制协议):是一种面向连接的传输层协议,
它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)
UNIX域套接字
socket同样可以用于本地通信
创建套接字时使用本地协议PF_UNIX(或PF_LOCAL)。
分为流式套接字和用户数据报套接字
和其他进程间通信方式相比使用方便、效率更高
常用于前后台进程通信
struct sockaddr_un
{
__SOCKADDR_COMMON (sun_);
char sun_path[108]; /* Path name. */
};
【2】网络预备知识
Socket
是一个编程接口
是一种特殊的文件描述符 (everything in Unix is a file)
并不仅限于TCP/IP协议
面向连接 (Transmission Control Protocol - TCP/IP)
无连接 (User Datagram Protocol -UDP 和 Inter-network Packet Exchange - IPX)
IP地址
IP地址是Internet中主机的标识
Internet中的主机要与别的机器通信必须具有一个IP地址
端口号
为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别.
vi /etc/services
TCP端口号与UDP端口号独立
端口号一般由IANA (Internet Assigned Numbers Authority) 管理
众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
已登记端口:1024~49151
动态或私有端口:49152~65535
字节序
0x12345678
不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO):
小端序(little-endian) - 低序字节存储在低地址
将低字节存储在起始地址,称为“Little-Endian”字节序,Intel、AMD等采用的是这种方式;
大端序(big-endian)- 高序字节存储在低地址
将高字节存储在起始地址,称为“Big-Endian”字节序,由ARM、Motorola等所采用
网络字节序是大端字节序。
【3】int socket(int domain, int type, int protocol);
功能:创建一个网络套接字
参数:domain AF_UNIX, AF_LOCAL 本地通信
AF_INET 网络通信
type SOCK_STREAM 进行tcp通信
SOCK_DGRAM 进行udp通信
SOCK_RAW 原始套节字通信
protocol 0 使用系统提供协议
返回值:成功 新的文件描述符
出错 -1
【4】int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:绑定网络信息结构体与套接字
参数:sockfd 网络套接字
addr 网络信息结构体
addrlen 网络信息结构体大小
返回值:成功 0,出错 -1
*************************************************************************
标准通信结构体:
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
*************************************************************************
网络通信结构体:
/* Structure describing an Internet socket address. */
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_); // sa_family_t sin_family;
in_port_t sin_port; /* Port number. */ 端口号
struct in_addr sin_addr; /* Internet address. */ IP地址
/* Pad to size of `struct sockaddr'. */
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
};
-----------------------地址族-----------------------------------------------
#define __SOCKADDR_COMMON(sa_prefix) sa_family_t sa_prefix##family
## 在宏定义中,代表的是字符串的拼接。
typedef unsigned short int sa_family_t;
===》 unsigned short int sin_family;
------------------------端口号------------------------------------------------
in_port_t sin_port;
==》 typedef uint16_t in_port_t;
==》 typedef unsigned short int uint16_t;
-------------------------IP地址------------------------------------------------
struct in_addr sin_addr;
==》
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};
typedef unsigned int uint32_t;
---------- 占位成员,使sockaddr 与 sockaddrin 两个结构体的大小保持一致---------
unsigned char sin_zero[8]; 不填充任何数据,作为占位使用。
【5】转换函数
in_addr_t inet_addr(const char *cp);
功能:将点分十进制的ip字符串,转换为二进制的网络字节序数据。
参数:cp ip字符串
uint16_t htons(uint16_t hostshort);
功能:将无符号短整形主机字节序数据转换为网络字节序数据。
char *inet_ntoa(struct in_addr in);
功能:将网络字节序的二进制数据,转换为 点分十进制的字符串
uint16_t ntohs(uint16_t netshort);
功能:将网络字节序的数据,转换为主机字节序数据
【6】 int listen(int sockfd, int backlog);
功能:将套接字置为被动监听模式,监听请求的到来。
参数:sockfd 网络套接字
backlog 监听队列的大小
返回值:成功 0,出错 -1
【7】int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:接收客户端的连接请求,返回一个新的网络套接字(专门被用来与相对应的客户端进行通信)
参数:sockfd 监听套接字
addr 客户端的网络信息结构体
addrlen 网络信息结构体大小
返回值:成功 一个新的文件描述符
出错 -1
【8】 int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:向服务器发起连接请求
参数:sockfd 网络套接字
addr 服务器网络信息结构体
addrlen 结构体大小
返回值:成功 0,出错 -1
【9】定义追踪
1-- 生成索引文件, /usr/include
sudo ctags -R
2-- vim -t "sockaddr"
3-- ctrl + ] 向下一级追踪
ctrl + t 返回上一级
【10】ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:发送消息
参数:sockfd 网络套接字
buf 要发送的消息的缓存区首地址
len 消息的大小
flags 0 阻塞
返回值:成功 实际发送的字节数
出错 -1
【11】ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:接收消息
参数:sockfd 网络套接字
buf 接收的消息的缓存区首地址
len 消息的大小
flags 0 阻塞
返回值:成功 实际接收到字节数
如果对方关闭,返回值为0
出错 -1