当前位置: 首页 > news >正文

TCP、UDP

端口号:
    端口号:  16位数值(unsigned short ) //0~65535 (65536个数)
       //标示一个进程
      TCP和 UDP 的端口号是独立的
  端口号:
    (1) 
       作用:唯一的标识一个进程
       每一个应用程序进程有一个端口号,
       通讯时区分数据包属于哪个应用程序进程
http协议用到的端口号:80

在配置tcp和udp通信的地址和端口号时,因为

1.网络协议在底层使用二进制格式来表示数据。IP地址和端口号在内存中以二进制形式存储,以便于计算机处理和网络设备识别。

2.不同的计算机系统可能使用不同的字节序(大端或小端)。使用这些转换函数可以确保数据在不同系统间传输时保持一致性。

udp:特点:无连接、不可靠

tcp:特点:面向连接、可靠传输

使用udp进行模拟通信的过程:

客户端:socket --- > //fgets(实现多次通信)---->  sendto ---->  recvfrom ---->printf 

服务器端:socket --->bind ---->  recvfrom //保存了客户端的地址 srcaddr---->  sprintf ---->sendto //  srcaddr 

2.查看地址 
  
  //linux
  ifconfig //查看网卡相关信息 --- 包含ip地址 
  
  //windows 下 cmd 
  ipconfig /all  

 tcp的c/s架构模拟:

1.建立连接(socket --->bind ---> listen --->accept)

2.通信过程(read --->write --->close)

tcp如何建立连接:

tcp三次握手:

客户端                        服务器 
     -----我要和你建立连接--->
     <----好的,可以建立连接--
     -----好 ---------------->

断开连接:

tcp四次挥手:

客户端                        服务器 
     -----我要和你断开连接--->
     <----好的,可以断开------
     <----我也要断开----------
     -----好 ----------------> 

函数原型:

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
 功能:该函数固定有客户端使用,表示从当前主机向目标
            主机发起链接请求。
 参数:sockfd 本地socket创建的套接子id
            addr 远程目标主机的地址信息。
            addrlen: 参数2的长度。
 返回值:成功 0
               失败 -1

练习:

使用tcp协议,实现server收到信息后回发

server

#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <sys/types.h>#include<stdio.h>#include <string.h>#include <unistd.h>int main(int argc,char *argv[]){int listen_fd = socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(50000);seraddr.sin_addr.s_addr = inet_addr("192.168.206.128");if(bind(listen_fd,(const struct sockaddr*)&seraddr,sizeof(seraddr)) < 0){perror("bind fail");return -1;}if(listen(listen_fd,5) < 0){perror("listen error");return -1;}int connfd = accept(listen_fd,NULL,NULL);if(connfd < 0){perror("accept error");return -1;}printf("connfd = %d\n",connfd);char buf[1024];char buf1[1024];while(1){read(connfd,buf,sizeof(buf));sprintf(buf1,"server + %s\n",buf);write(connfd,buf1,strlen(buf1)+1);printf("%s\n",buf);}return 0;}

client

#include <stdio.h>
int main(int argc,char *argv[])
{int soc_fd = socket(AF_INET,SOCK_STREAM,0);if(soc_fd < 0){perror("socket fail");return -1;}struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(50000);seraddr.sin_addr.s_addr = inet_addr("192.168.206.128");struct sockaddr_in srcaddr;socklen_t addrlen = sizeof(srcaddr);if (connect(soc_fd,(const struct sockaddr*)&seraddr,sizeof(seraddr)) < 0){perror("connect fail");}char buf[1024];char buf1[1024];while(1){fgets(buf,sizeof(buf),stdin);write(soc_fd,buf,strlen(buf)+1);read(soc_fd,buf,sizeof(buf));printf("%s\n",buf);}return 0;
}


http://www.mrgr.cn/news/10641.html

相关文章:

  • Pytorch:torch.diag()创建对角线张量方式例子解析
  • react 修改对象参数的值
  • FFmpeg 实现从设备端获取音视频流并通过RTMP推流
  • Python分布式任务处理库之dramatiq使用详解
  • JVM的内存模型和垃圾回收
  • MongoDB 查询分享 包含( 筛选 分组 排序 脱敏 格式化日期)
  • 数据库里的幽灵数据 - SQLite WAL模式探秘
  • 【前端面试】React深度学习(上)
  • 贪心算法---分发糖果
  • C# 匿名函数 delegate(参数...){ }
  • 《5G 与区块链融合:智能城市服务质量的飞跃》
  • 用命令行工具(nmcli)模仿ubuntu21图形界面的热点功能
  • 【学习笔记】STM32F407探索者HAL库开发(二)STM32F4最小系统设计
  • SpringBoot依赖之Spring Data Redis 实现地理坐标(Geospatial)
  • HTTP无状态是什么意思?Cookie又是什么?
  • 接口自动化测试面试题目详解
  • Apache Dubbo关键点分析
  • UE5学习笔记18-使用FABRIK确定骨骼的左手位置
  • 开放式耳机是什么意思?开放式耳机推荐
  • 交换排序(冒泡排序和快速排序)