网络套接字:socket
一个文件件描述指向一个套接字(该套接字内部由内核借助两个缓冲区实现)
在通讯过程中,套接字一定是成对出现的
网络字节序
1、小端法:(pc本地存储)高位存高地址,地位存低地址
2、大端法:(网络存储)高位存低地址。低位存高地址
3、htonl–>本地—>网络(ip) :192.168.1.11—>string–>atoi—>int—>htonl---->网络
4、htons—>本地—>网络(port)
5、ntohl—>网络—>本地(ip)
6、ntohs---->网络----->本地(port)
IP地址装换函数
//本地字节序---->网络字节序
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
//af:AF_INET、AF_INET6
//src:IP地址(点分十进制)
//dst:传出,装换后的网络字节序的IP地址
//返回值:成功 1
// 异常 0 说明不是一个有效的ip地址
// 失败:-1
//网络字节序------>本地字节序
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
/*af:AF_INET、AF_INET6
*SRC:网络字节序的IP地址
*dst:本地字节序的IP地址(string IP)
*size:dst的大小
*返回值:成功:dst
* 失败:NULL
*/
sockaddr数据结构
Address format
An IP socket address is defined as a combination of an IP interface address and a 16-bit port number. The basic IP protocol does not supply port
numbers, they are implemented by higher level protocols like udp(7) and tcp(7). On raw sockets sin_port is set to the IP protocol.
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
socket模型创建
重要结论:整个模型一共有三个套节字
//流程分析
1、socket()会生成一个套节字
2、bind()绑定ip+port
3、listen()设置监听上限,同时
4、accpet()阻塞监听客户端连接
函数分析
socket
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
//创建一个套接字
int socket(int domain, int type, int protocol);
domain:AF_INET、AF_INET6、AF_UNIX(创建本地套接字)
type:SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)
protocol:0
返回值:succes:新套接字所对应的文件描述符
failure:-1 error
bind
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h> //绑定ip和端口
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
listen
//listen - listen for connections on a socket
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);
accept
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
connect
//connect - initiate a connection on a socket
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
TCP流程分析
server:
1、socket() 创建套接字,生成一个文件描述符
2、bing() 绑定服务器的地址结构
3、listen() 设置监听的上限
4、accept() 阻塞监听客户端连接
5、read(fd) 读socket获取客户端数据
6、执行自己的程序
7、write(fd)
8、close(fd)
client:
1、socket() 创建socket
2、connect() 与服务器建立连接
3、write() 写数据到socket
4、read() 读数据
5、执行自己的程序
6、close()