TCP: 可靠传输协议,速度慢,一般用于文件,与控制指令的传输。
查看网络IP地址: ifconfig
设置网络的IP地址信息: ifconfig 网卡设备号 网络IP地址 例子:ifconfig ens33
192.168.5.2
设置网关地址: route add default gw 192.168.5.1
------TCP 通信流程-----
客户端:
1.创建通信对象
2.设置服务器的地址信息
3.链接到服务器中
4.进行数据的交互
5.关闭通信
服务器端:
1.创建通信对象
2.设置服务器的地址信息
3.在本地网络中注册服务器信息
4.把服务器设置为监听模式
5.接收客户端的链接请求
6.进行数据的交互
7.关闭通信
--------------------------tcp客户端的搭建流程----------------------------------
1.创建通信对象socket
NAME
socket - create an endpoint for communication
SYNOPSIS
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
domain: 网络层协议 AF_INET IPv4 Internet protocols ip(7)
type:传输层协议 SOCK_STREAM TCP协议
SOCK_DGRAM UDP协议
protocol:通信对象的属性 默认 0
返回值: 成功返回新的通信对象
失败 -1
2.设置服务器信息
struct sockaddr_in { sa_family_t sin_family; /* address family:AF_INET ///网络通信网络层协议 AF_INET
in_port_t sin_port; / port in network byte order //服务器的端口号
struct in_addr sin_addr; / internet address */ }; //网络IP地址/* Internet address. / struct in_addr {
uint32_t s_addr; / address in network byte order */ }; //这个才是真正的网络地址信息
IP的设置 : man 7 inet_addr
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>in_addr_t inet_addr(const char *cp); //把字符串类型的IP地址转换成 网络地址类型 char *inet_ntoa(struct in_addr in);//把网络地址类型转换成 字符串类型的IP地址
**注意:所有的网络通信都是使用大端的通信方式的 (防止数据的错乱)
uint16_t htons(uint16_t hostshort); //把本地字节序变成网络字节序 uint16_t
ntohs(uint16_t netshort); //把网络字节序变成本地字节序**
3.链接网络服务器
NAME
connect - initiate a connection on a socketSYNOPSIS
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); sockfd:网络通信对象 addr: 服务器的IP地址信息 addrlen: 服务器的IP地址信息的长度 返回值: 0 成功 -1 失败
4.进行数据的交互 read/write
网络通信是双通道的。
read:读取,当网络中没有数据的时候读阻塞 当网络连接断开时,读就不阻塞,一直读到数据为0
write:写数据,要根据数据的真实大小写入。 当不断往网络中写入数据,且没有用户读取时 写会阻塞
5.关闭网络通信对象
close(int sockfd);
6.示例代码
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
int main()
{
//1.创建网络的通信对象
int socket_fd = socket(AF_INET,SOCK_STREAM,0);
if(socket_fd < 0)
{
perror("creat fail:\n");
return -1;
}
//2.定义网络信息结构体
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;//设置网络层协议
seraddr.sin_addr.s_addr = inet_addr("192.168.31.71"); //设置IP地址 linux:51;vscode:71
seraddr.sin_port = htons(1234); //设置端口号
/* 利用TCP 协议连接到百度服务器
//设置百度服务器的IP地址信息 14.215.177.39
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;//设置网络层协议
seraddr.sin_addr.s_addr = inet_addr("14.215.177.39"); //设置IP地址
seraddr.sin_port = htons(80); //设置端口号
*/
//3.链接网络服务器
int ret =connect(socket_fd,(struct sockaddr *)&seraddr,sizeof(seraddr));//三次握手
if(ret != 0)
{
perror("connect fail:");
return -1;
}
else
{
printf("connect ok\n");
}
//2.为什么网络通信要同一字节序
//效率会高一点
//大端格式 :高位地址存放低位的数据 小端格式:高位地址存放高位的数据
int len =0;
sleep