计算机S 计算机C
创建socket对象 创建socket对象
准备通信地址(自己的ip(非公网ip)) 准备通信地址
(计算机S的,与C在同一个局域网,或者S是公网ip)
绑定sokect对象和地址 ...
监听 ...
等待连接 连接
接收\发送数据 发送\接收数据
关闭socket 关闭socket
#include
uint32_t htonl(uint32_t hostlong);
功能:把4字节的本地字节序转化成网络字节序
uint16_t htons(uint16_t hostshort); //本地是小端 网路通信是大端
功能:把2字节的本地字节序转化成网络字节序 //h:home 本地 to n:net 网络 s:short 端口号是2个字节大端数据
uint32_t ntohl(uint32_t netlong);
功能:把4字节的网络字节序转化成本地字节序
uint16_t ntohs(uint16_t netshort);
功能:把2字节的网络字节序转化成本地字节序
// 网络通信时使用
#include
struct sockaddr_in {
__kernel_sa_family_t sin_family; //
__be16 sin_port; // 端口号 需要大端数据
struct in_addr sin_addr; // IP地址结构体
};
struct in_addr {
__be32 s_addr; // IP地址数据 大端整数
};
点分十进制字符串的ip地址转换成小端整数、然后还需要转大端:
"192.168.0.1" (192<24)|(168<16)|(0<8)|(1)
11000000 00000000 00000000 00000000 (192<24)
10101000 00000000 00000000 (168<16)
00000000 00000000 (0<8)
1 (1)
11000000 10101000 00000000 00000001
in_addr_t inet_addr(const char *cp);
功能:把字符串形式的点分十进制的ip地址转换成大端的整数形式的ip地址
char *inet_ntoa(struct in_addr in);
功能:把大端的ip整数转换成字符串形式的点分十进制的ip地址
计算机S 计算机C
创建socket 创建socket
准备通信地址(自己的) 准备通信地址(S的地址)
绑定socket和通信地址 ...
接收\发送数据 发送\接收数据
关闭socket 关闭socket
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
功能:UDP专用的数据发送
sockfd:socket描述符
buf:待发送的数据内存首地址
len:要发送的字节数
flags:一般写0阻塞发送即可
dest_addr:发送目标的地址结构体
addrlen:地址结构体的字节数
返回值:成功发送的字节数,-1出现错误
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能:UDP专用的数据接收函数
sockfd:socket描述符
buf:存储接收的数据内存首地址
len:buf的大小
flags:一般写0阻塞接收即可
src_addr:获取发送者的地址 //输出型参数 需要准备一个结构体接
addrlen:先要输入才能输出发送者的地址
返回值:成功接收到的字节数 -1出现错误 0表示关闭通信
1、TCP是面向连接的,UDP是面向无连接的;
2、UDP程序结构较简单;
3、TCP是面向字节流的,UDP是基于数据报的;
4、TCP保证数据正确性,UDP可能丢包;
5、TCP保证数据顺序,UDP不保证。