TCP通信
(一) tcp实验
ip 用途,唯一识别机器
port 用来绑定程序,即端口用来识别程序
服务端
//1.创建socket
#include <sys/types.h> //常用类型
#include <sys/socket.h> //socket函数等
int socket(int domain, int type, int pro-tocol);
返回值,是设备的描述符 失败返回 -1
参数:
domain: AF_INET 当前使用的
type: 协议类型 套接字类型
TCP 文件 SOCK_STREAM 流式套接字
UDP qq SOCK_DGRAM 数据报
ICMP ping SOCK_RAM 原始套接字
pro-tocol 协义簇类型
0 符合协议簇和套接字类型的默认协议 通常设为0
//3.启动侦听
int listen(int sockfd, int backlog);
参数:sockfd: 服务端套接字描述符 socket返回的值
backlog: 指定排队等待接受连接的最大值 系统最大值SOMAXCONN
返回值:0成功 -1失败
//4.接受连接请求
int accept(int sockfd,struct sockaddr *addr, size_t *addrlen);
参数:sockfd: 服务端套接字描述符
addr: 获取过来的客户的地址信息
addrlen:获取过来的客户的地址信息长度
返回值:成功 返回的是与客户端进行通信用的套接字描述符 失败-1
必须是循环等待接受连接请求.
//5.数据收发
ssize_t recv(int s, void *buf, size_t len, int flags);
ssize_t send(int s, const void *buf, size_t len, int flags);
参数:s: 套接字描述符
服务端:是accept返回值
客户端: 是socket返回值
buf:内存地址
len:数据长度
flags 标志位
0 阻塞
MSG_DONTWAIT 非阻塞
//6.关闭描述
int close(int fd);
//2.绑定 把ip和port与程序捆绑在一起
int bind(int sockfd,struct sockaddr *addr,size_t addrlen);
参数:sockfd是socket返回的描述符
addr 指向套字地址结构的指针 本机的地址和端口
addrlen:结构体长度
返回值:0 成功,-1 失败
1)struct sockaddr结构体
struct sockaddr{
short sa_family; //指定的地址簇,AF_INET
char sa_data[14]; //IP地址,端口号
};
通常用另一种结构来填写
struct sockaddr_in{
short sin_family; //指定的地址簇,地址簇和协议簇相同,AF_INET
short sin_port; //端口号
struct in_addr sin_addr; //IP地址
char sin_zero[8];
};
struct in_addr{
unsigned long s_addr;
};
2)IP地址和端号
存储ip和端口时,用网络字节序来存储
b.端口号sin_port
0 代表由系统自动随机分配端口号。
其它值 为用户指定的端口号
注:客户端可以设置为0,服务器端不能设为0。 在服务端一般指定端口号 ushort 0-65535
c.IP地址sin_addr
INADDR_ANY 代表可以由系统将本机上所有的IP进行绑定大多用于服务器端
其它值 为用户端指定要绑定的IP
d.字节序
in_addr_t inet_addr(char *cp); //把字符串格ip变字节序
uini16_t htons(uini16_t hostshort); //把端口号变字节序
客户端
//.1
socket
//.2 连接服务器
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
参数:sockfd:客户端套接字描述符
serv_addr:客户端填写的要连接的服务器的地址
addrlen : 地址信息长度
//.3
recv
send
//.4
close
来源:https://www.cnblogs.com/qiuly/p/8399756.html