TCP通信流程

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 socket

SYNOPSIS
#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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值