网络营销导向的企业网站建设的要求,邳州市建设局官方网站,怎么找拉新推广平台,哈尔滨网站建设团队TCP与UDP区别
UDP#xff1a;用户数据报协议#xff0c;面向无连接#xff0c;可以单播#xff0c;多播#xff0c;广播#xff0c; 面向数据报#xff0c;不可靠TCP#xff1a;传输控制协议#xff0c;面向连接的#xff0c;可靠的#xff0c;基于字节流#xff…TCP与UDP区别
UDP用户数据报协议面向无连接可以单播多播广播 面向数据报不可靠TCP传输控制协议面向连接的可靠的基于字节流仅支持单播传输 socket通信
是对网络中不同主机上的应用程序进程之间进行双向通信的端点的抽象
字节序
**小端字节序**低位存在内存的低位 大端字节序低位存在内存的高位 eg:小端 0x01 02 03 04 01是高位有效字节04是低位那么在内存中是这么存的 0x04 0x03 0x02 0x01
字节序转化内函数
h - host 主机主机字节序
to - 转换成什么
n - network 网络字节序
s - short unsigned short
l - long unsigned int#include arpa/inet.h
// 转换端口 short型2个字节
uint16_t htons(uint16_t hostshort); // 主机字节序 网络字节序
uint16_t ntohs(uint16_t netshort); // 主机字节序 网络字节序
// 转IP int型4个字节
uint32_t htonl(uint32_t hostlong); // 主机字节序 网络字节序
uint32_t ntohl(uint32_t netlong); // 主机字节序 网络字节序ip地址转换------点分十进制–网络通信2进制 通常人们习惯用可读性好的字符串来表示 IP 地址比如用点分十进制字符串表示 IPv4 地址以及用十六进制字符串表示 IPv6 地址。但编程中我们需要先把它们转化为整数二进制数方能使用。而记录日志时则相反我们要把整数表示的 IP 地址转化为可读的字符串 新版同时适用于IPV4和IPV6* 字母含义* p点分十进制的IP字符串* n表示network网络字节序的整数
* int inet_pton(int af, const char *src, void *dst); * 使用man inet_pton查看帮助* 功能将点分十进制的IP地址字符串转换成网络字节序的整数* 参数* af地址族* IPV4AF_INET* IPV6AF_INET6(IPV6)* src需要转换的点分十进制的IP字符串* dst转换后的结果保存在这个里面* 返回值* 1成功* 0源IP地址有误* -1地址族包含不可用的地址协议
* const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);* 使用man inet_ntop查看帮助* 功能将网络字节序的整数转换成点分十进制的IP地址字符串* 参数* af地址族* IPV4AF_INET* IPV6AF_INET6(IPV6)* src要转换的ip的整数的地址* dst转换成IP地址字符串保存的地方* size第三个参数的大小数组的大小* 返回值返回转换后的数据的地址字符串和 dst 是一样的把IP和port打包为一个socket地址
协议族地址族描述PF_UNIXAF_UNIXUNIX本地域协议族PF_INETAF_INETTCP/IPV4z协议族PF_INET6AF_INET6tcp/IPV6协议族
//socket网络通信接口中表示socket地址的是一个结构体他的地址作为通信用但一般用下面的改进版本再转换成这个
#include bits/socket.h
struct sockaddr { sa_family_t sa_family; char sa_data[14];
};typedef unsigned short int sa_family_t;为了兼容IPV6新的socketaddr_in
// IPV4
#include netinet/in.h
-----------------------------------------------------------------------
struct sockaddr_in { sa_family_t sin_family; /* __SOCKADDR_COMMON(sin_) */ in_port_t sin_port; /* Port number. */ struct in_addr sin_addr; /* Internet address. */ /* Pad to size of struct sockaddr. */ unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof (struct in_addr)];
};
-----------------------------------------------------------------------
struct in_addr { in_addr_t s_addr;
};// IPV6
struct sockaddr_in6 { sa_family_t sin6_family; in_port_t sin6_port; /* Transport layer port # */ uint32_t sin6_flowinfo; /* IPv6 flow information */ struct in6_addr sin6_addr; /* IPv6 address */ uint32_t sin6_scope_id; /* IPv6 scope-id */
};// 相关定义
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef uint16_t in_port_t;
typedef uint32_t in_addr_t;
#define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int))TCP通信框架 实例客户端和服务端通信
服务端
#include stdio.h
#include arpa/inet.h
#include unistd.h
#include iostream
#include stringusing namespace std;
#define SERVERIP 192.168.226.129
#define PORT 9999//服务器端
int main() {//创建socket套接字形成监听fdint lfd socket(AF_INET, SOCK_STREAM, 0);if (lfd -1) {perror(socket);return -1;}//形成一个端把ip和port打包好在新版的sockaddr_in结构体中struct sockaddr_in mServ;mServ.sin_family AF_INET;mServ.sin_port htons(PORT);//将上面字符串形式的点分十进制IP转化为网络字节序的IPinet_pton(AF_INET, SERVERIP, mServ.sin_addr.s_addr);//将上面的打包的端和监听fd绑定int ret bind(lfd, (struct sockaddr*)mServ, sizeof(mServ));if (ret -1) {perror(bind);return -1;}//监听fd开始监听,后面的值代表未连接和连接的数ret listen(lfd, 128);if (ret -1) {perror(listen);return -1;}cout 服务器启动成功等待连接.... endl;//接受连接返回一个新的真正用于交换数据的fdstruct sockaddr_in client;socklen_t client_addr_len sizeof(client);int cfd accept(lfd, (struct sockaddr*)client, client_addr_len);if (cfd -1) {perror(accept);return -1;}//输出客户端的ip和端口char clinet_ip[16];inet_ntop(AF_INET, client.sin_addr.s_addr, clinet_ip, sizeof(clinet_ip));//将n-p的ip写到clinet_ip中int clinet_port ntohs(client.sin_port);cout 连接成功客户端IP clinet_ip 端口 clinet_port endl;//读取客户端的数据char buf[1024];char writer[1024];while(1) {int read_len read(cfd, buf, sizeof(buf));if (read_len -1) {perror(read);return -1;}else if (read_len 0) {cout 客户端断开连接 endl;break;}else if (read_len 0) cout 客户端发来的数据 buf endl;//向客户端发送数据cout 请输入要发送的数据;cin writer;write(cfd, writer, sizeof(writer));} close(cfd);close(lfd);return 0;
}客户端
#include stdio.h
#include arpa/inet.h
#include unistd.h
#include iostream
#include stringusing namespace std;
#define SERVERIP 192.168.226.129
#define PORT 9999//客户端
int main() {int fd socket(AF_INET, SOCK_STREAM, 0);if (fd -1) {perror(client_socket);return -1;}//打包client的IP和PORT信息struct sockaddr_in clit;clit.sin_family AF_INET;clit.sin_port htons(PORT);inet_pton(AF_INET, SERVERIP, clit.sin_addr.s_addr);//客户端开始连接服务器int ret connect(fd, (struct sockaddr*)clit, sizeof(clit));if (ret -1) {perror(client connect);return -1;}cout 客户端开始连接.... endl;//开始通信char writer[1024];char buf[1024];while(1) {cout 请输入发给服务器的内容;cin writer;ret write(fd, writer, sizeof(writer));if (ret -1) {perror(client write);return -1;}ret read(fd, buf, sizeof(buf));if (ret -1) {perror(client read);return -1;} else if (ret 0) {cout 服务器断开连接 endl;break;} else cout 受到客户端返回信息 buf endl;}close(fd);return 0;
}