1、socket 函数—创建套接字、 “sys/socket.h”
int socket(int family,int type,intprotocol)
socket()打开一个网络通讯端口,如果成功,就返回一个文件描述符应用程序可以像读写文件一样用read/write在网络上收发数据;如果不成功,就返回-1
(1)对于IPv4,family参数指定为AF_INET
(2)对于TCP协议,type参数指定SOCK_STREAM,表示面向流的传输协议如果是UDP协议,则type参数指定为SOCK_DGRAM,表示面向数据报的传输协议,SOCK_RAW原始套接字
(3)protocol指定为0即可;
bind函数—绑定本机地址和端口“sys/types.h”“sys/socket.h”“arpa/inet.h”“netinet/in.h”
int bind(int sockfd,conststruct sockaddr *my_addr,socklen_t addrlen)
(1)sockfd: socket调用返回的文件描述符
(2)描述本机的端口和IP地址
my_addr是指向 sockaddr 结构的指针,包含本机IP 地址和端口号
(3)addrlen: sockaddr地址结构的长度
服务器需要调用bind绑定一个固定的网络地址和端口号.bind()成功返回0,失败返回-1
bind()的作用是将参数sockfd和my_addr绑定在一起,使sockfd这个用于网络通讯的文件描述符监听my_addr所描述的地址和端口号
connect函数—建立连接 返回值0或-1“sys/types.h”、“sys/socket.h”
intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen)
(1)sockfd : socket返回的文件描述符
(2)serv_addr : 服务器端的地址信息
(3)addrlen : serv_addr的长度
listen函数—监听连接的套接字返回值0或-1
int listen(int sockfd,intbacklog)
(1)sockfd:监听连接的套接字
(2)backlog:最多能处理的连接请求
accept函数—接受TCP连接返回值已经建立好连接的套接字或-1“sys/types.h”、“sys/socket.h”
intaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen)
(1)sockfd : 监听套接字
(2)addr : 对方地址,如果不关心可以设置为NULL
(3)addrlen:地址长度 地址
recv函数—数据接收返回值为实际接收的字节数或 -1 “sys/socket.h”
ssize_trecv(int socket,const void*buffer, size_t length, intflags)
(1)buffer : 发送缓冲区首地址(2)length : 发送的字节数(3)flags : 接收方式(通常为0)
send函数—数据发送返回值为实际发送的字节数或 -1 “sys/socket.h”
ssize_t send(intsocket, constvoid *buffer,size_t length, int flags)
(1)buffer : 发送缓冲区首地址(2)length : 发送的字节数(3)flags : 发送方式(通常为0)
read函数—数据接收 ssize_t read(int fd,void *buf, size_t count)
write函数—数据发送 ssize_t write(int fd,const void *buf, size_t count)
recvfrom函数—数据接收
ssize_t recvfrom(int socket, void *buffer, size_t length, intflags, struct sockaddr *address, socklen_t *address_len);
sendto函数—数据发送ssize_t sendto(int socket, void*message, size_t length, int flags, struct sockaddr *dest_addr,socklen_t dest_len);
close函数—关闭套接字int close(int sockfd)
shutdown函数—关闭套接字int shutdown(int sockfd, inthowto)
2、套接字socket有三种:流式套接字(使用TCP协议)—SOCK_STREAM、数据报套接字(使用UDP协议)—SOCK_DGRAM 、原始套接字
3、地址结构
struct sockaddr
{
u_short sa_family;
char sa_data[14];
};
Sa_family:地址族,采用“AF_xxx”的形式,如:AF_INET
Sa_data:14字节的特定协议地址
struct sockaddr_in
{
short int sin_family;
unsigned short intsin_port;
struct in_addrsin_addr;
unsigned charsin_zero[8];
};
编程中一般并不直接针对sockaddr数据结构操作,而是使用与sockaddr等价的sockaddr_in数据结构
struct in_addr
{
unsignedlong s_addr;
}
S_addr: 32位的地址
4、字节序转换
网络字节顺序采用big endian排序方式
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); htonl:把unsignedlong类型从主机序转换到网络序
uint16_t htons(uint16_t hostshort); htons:把unsignedshort类型从主机序转换到网络序
uint32_t ntohl(uint32_t netlong); ntohl:把unsignedlong类型从网络序转换到主机序
uint16_t ntohs(uint16_t netshort); ntohs:把unsignedshort类型从网络序转换到主机序
5、OSI七层网络模型:应用层 表现层 会话层、传输层、网络层、数据链路层 物理层
LinuxTCP/IP四层概念模型:应用层、传输层、网际层、网络接口(物理层)
6、TCP/IP协议组大体上分为三部分:Internet协议—IP传输控制协议—TCP和用户数据报协议—UDP处于 TCP 和 UDP之上的一组应用协议。它们包括:TELNET,文件传送协议(FTP),域名服务(DNS)和简单的邮件传送程序(SMTP)等
7、IO模型 -- 在UNIX/Linux下主要有4种I/O 模型:
--阻塞I/O
--非阻塞I/O
int fcntl(int fd, int cmd, long arg);
int flag;
flag = fcntl(sockfd, F_GETFL, 0);
flag |= O_NONBLOCK;
fcntl(sockfd, F_SETFL, flag);
--I/O多路复用
select函数—“sys/time.h”“sys/types.h”“unistd.h”
int select(int n, fd_set *read_fds, fd_set *write_fds, fd_set*except_fds, struct timeval *timeout)
(1)n: maxfd所有监控的文件描述符中最大的那一个加1
(2)read_fds:所有要读的文件文件描述符的集合
(3)write_fds:所有要的写文件文件描述符的集合
(4)except_fds:其他要向我们通知的文件描述符
(5)timeout:超时设置.、NULL:一直阻塞,直到有文件描述符就绪或出错、时间值为0:仅仅检测文件描述符集的状态,然后立即返回、时间值不为0:在指定时间内,如果没有事件发生,则超时返回。
FD_SET将fd加入到fdsetFD_CLR将fd从fdset里面清除FD_ZERO从fdset中清除所有的文件描述FD_ISSET判断fd是否在fdset集合中
poll 函数—“sys/poll.h” intpoll(struct pollfd *ufds, unsigned int nfds, int timeo