首页 > 其他分享 >网络通信(TCP+UDP通信)

网络通信(TCP+UDP通信)

时间:2024-08-22 21:53:06浏览次数:14  
标签:网络通信 UDP socket int 绑定 TCP 地址 sockfd 客户端

一、UDP协议 
1.1、recvfrom()
参数说明

int sockfd, //socket 的fd

void *buf, // 保存数据的一块空间的地址

size_t len, //这块空间的大小

int flags,// 0 默认的接收方式 -----阻塞方式 默认行为是阻塞

a.MSG_DONTWAIT 不阻塞方式,用他的话代表读的时候是非阻塞方式
b.类似与读操作,如果没有东西就等待,一直等待
c.如果我们把发送和接收放一块的话,读端没有发送,也会使我们写端阻塞到哪里,除非数据发送过来

struct sockaddr *src_addr,//用来保存发送方的地址信息,接收谁给发的

socklen_t *addrlen);表示发送方发送实际的地址信息大小

注意 要是不关心是谁,我们addrlen或者大小写NULL

我们先将值传递过去,他会将我们的真实的长度带出来,也就是说我们自己建立好一个他的地址信息的结构体

返回值

成功 返回接收到的字节数

失败 返回-1

注意点:

a. inet_ntoa()将网络的字节序变成字符串类型
b. ntohs()  将网络的端口号转换成主机号的
c. 当一个socket创建之后它存在它存在了一个命名空间但是没有地址绑定,bind()就是给其进行绑定一个地址,相当于给一个套接字绑定了一进程的信息;绑定的IP是我们地址(服务器所在那台电脑的地址信息),socket 不绑系统会绑定

1.2、bind()绑定
服务器是需要绑定一下来进行操作

  int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

功能:

如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2指定的接口地址关联:用于从该接口接受数据。如果该函数在客户端调用,则表示要将数据从参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。
注意:
如果是客户端,则该函数可以省略,由默认接口发送数据。

参数

a. sockfd 之前通过socket函数创建的文件描述符,
b. 套接字id my_addr 是物理接口的结构体指针。表示该接口的信息。

注意点

客户端可以绑定地址,但一般不绑定

  1. 为什么要给服务器绑定地址,因为初始的时候,如果服务器开始没有发信息,那么客户端就找不到,所以要绑定地址
  2. 绑定的是服务器端运行的地址

二、TCP

2.1、客户端

1、建立连接

socket //买了一部手机

bind // 可选 //插上sim卡

connect 发起连接 // 拨打电话

2、通信过程

read

write

close

2.2、服务器端

1、建立连接

socket // 买了一部手机

bind //插上sim卡

listen //监听 客户端的连接请求

accept //接听

2、通信过程

read

write

close

2.3、TCP连接建立
1、tcp三次握手(建立连接)

客户端                                         服务器

-----我要和你连接--------------------->

<-------------------------------好的,可以建立连接

-----------好------------------------------>

2、tcp 四次挥手(断开连接) 

客户端                                             服务器

-----我要和你断开连接--------------------->

<-------------------------------好的,可以断开

<-------------------------------我也要断开-------

-----------好----------------------------------------->

三、函数实现
3.1、connect()建立连接
#include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>
 
       int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);

功能:该函数固定有客户端使用,表示从当前主机向目标主机发起链接请求。
参数:

  • sockfd 本地socket创建的套接子
  • daddr 远程目标主机的地址信息,
  • addrlen:参数2的长度。

返回值:成功0       失败 -1

3.2、listen() 监听
#include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>
 
       int listen(int sockfd, int backlog);

功能:

反应监听那个套接字并且建立成功之后返回一个新的套接字

参数

  • 当前的套接字
  • 同时可以监听的个数

返回值

  • 正确 返回建立的新的套接字
  • 错误 返回 -1 

listen 会标记一下被动的socket(这个socket将会被用来接受到来的接受请求)

注意

其有两个socket

1、监听的socket

2、处理建立连接的socket(后续进行操作的socket)

3.3、listen工作原理图

四、编程时注意的点
  1. write的时候是有校字长的同时也要注意加'\0',否则读出来的时候会指针越界,我们没有给其添加结束标志
  2.  read和write读写的时候注意要是对应的buf

标签:网络通信,UDP,socket,int,绑定,TCP,地址,sockfd,客户端
From: https://blog.csdn.net/2401_84308772/article/details/141438843

相关文章

  • 【待做】利用文件建立TCP连接隧道绕过防火墙
    原创二进制空间安全声明:二进制空间安全公众号文章中的技术只做研究之用,禁止用来从事非法用途,如有使用文章中的技术从事非法活动,一切后果由使用者自负,与本公众号无关。1.摘要File-Tunnel是一款用C#编写的通过文件建立TCP连接隧道的开源项目,该程序启动一个TCP监听器,......
  • 浅谈TCP和UDP协议的区别
    **传输模式**TCP协议:数据流(DataStream)--没有消息边界,比如服务端给客户端发来2048字节大小的数据,而客户端设置的一次最大接收大小为1024,这时候就意味着还有1024没能接收过来,要再接收一次。所以容易出现粘包的情况。所谓粘包,就是数据都粘在一起了。UDP协议:数据报(Da......
  • 网络编程UDP、TCP
    1UDP通信客户端UDPClientpublicclassUDPClient{publicstaticvoidmain(String[]args)throwsIOException{//获取本地服务器地址InetAddressserver_address=InetAddress.getLocalHost();//创建数据报套接字以连接到服务器......
  • 深入理解 TCP 协议与网络通信
    1.什么是TCP网络分层?TCP网络分层是指将计算机网络的通信过程分为不同的层次,每一层都承担特定的功能。通常,网络分为四个主要层次:应用层、传输层、网络层和链路层。这种分层结构使得网络协议的设计和实现更加清晰,便于维护和扩展。生活案例帮助记忆想象一下,网络就像一个快......
  • 【TCP】核心机制:滑动窗口、流量控制和拥塞控制
    文章目录滑动窗口窗口滑动滑动窗口丢包流量控制拥塞控制窗口大小变化过程滑动窗口有一类算法题,就是通过滑动窗口的思想来解决的,算法中的“滑动窗口”借鉴自TCP的滑动窗口TCP是要保证可靠传输的==>代价,降低了传输的效率(重传,确认重传等操作)TCP希望能在可靠传输......
  • IPC对象通信方式---共享内存 | 网络通信 -编程
    共享内存共享内存机制其允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取错做读出,从而实现了进程间的通信。是内核预留的内存空间,最......
  • TCP通信之经典问题解决
    先看下面的代码,研究下执行后会出现什么?服务端:fromsocketimport*ip_port=('127.0.0.1',8003)buffer_size=1024sock_server=socket(AF_INET,SOCK_STREAM)sock_server.bind(ip_port)sock_server.listen(5)whileTrue:print('服务端建立连接...')conn,addr=soc......
  • TCP,UDP,Socket,Http网络编程面试题 47道
    1.什么是网络编程        1.网络编程的本质是多台计算机之间的数据交换。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给其他设备,然后接受另外一个设备反馈的数据。现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另......
  • TCP/IP-网络层
    网络层的主要作用        网络层通过路由选择来确定数据包从发送端到接收端的最佳路径,并通过网络地址(如IP地址)来标识和寻址主机和网络。其提供的服务是无连接的,表示数据包的传输不依赖于事先建立的连接。路由选择        路由选择是确定数据包从源主机到目......
  • tcp多个客户端访问服务端,运用多线程
    客户端packagecom.shujia.day20.tcpdemo3;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.Socket;importjava.util.Scanner;/*1:建立客户端的Socket服务,并明确要连接的服务器。2:如果连接建立成功,就表明,已经建立了数据传输的通......