初学记录【linux应用】 TCP/UDP 网络编程 C语言

这篇具有很好参考价值的文章主要介绍了初学记录【linux应用】 TCP/UDP 网络编程 C语言。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以下内容分别为TCP 与 UDP编程,内容有相似或者重合部分,可根据流程 相互对照学习,都已经附上源码

TCP编程

TCP 服务器端_Server :

**1.**socket 创建 tcp套接字 (监听的套接字)

int iSocketServer = socket(AF_INET,SOCK_STREAM,0);

2、IPv4套接字地址结构

#include <netinet/in.h>

struct sockaddr_in{
unsigned short sin_family;  //2 字节 协议AF_INET
unsigned short sin_port;    //2字节 端口
struct in_addr sin_addr;	//4字节  IP地址(32位无符号整数)
unsigned char sin_zero[8];  //8字节   全写0
}

struct in_addr:

struct in_addr{
	in_addr_t s_addr;
}

如果使用 Internet 所以 sin_family 一般为 AF_INET。
⚫ sin_addr 设置为 INADDR_ANY 表示可以和任何的主机通信。
⚫ sin_port 是要监听的端口号。

定义IPv4地址结构,存放 本机信息

#define Server_port 8888 
struct sockaddr_in tSocketServerAddr;

tSocketServerAddr.sin_family = AF_INET;
tSocketServerAddr.sin_port = htons(Server_port);/*host to net,short*/
tSocketServerAddr.sin_addr.s_ad`dr = INADDR_ANY;可以和任何的主机通信
memset(tSocketServerAddr.sin_zero , 0, 8);

3、两种地址结构使用场合

struct sockaddr_in  是IPv4地址结构(存放客户端、服务器的地址信息(协议,port,IP))
struct sockaddr    是通用地址结构,不是存放数据,只是socket api类型转换

sockaddr定义 见下方4.bind介绍 中

4.bind给服务器的绑定固定的port、IP地址信息**

给iSocketServer套接字bind绑定一个固定的地址信息

bind 函数

int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

从函数用于将地址绑定到一个套接字。
⚫ sockfd 是由 socket 函数调用返回的文件描述符。
⚫ my_addr 是一个指向 sockaddr 的指针。
⚫ addrlen 是 sockaddr 结构的长度。

⚫ bind 将本地的端口同 socket 返回的文件描述符捆绑在一起.成功是返回 0,
失败的情况和 socket 一样。

***注: ***sockaddr 的定义(通用地址结构):

struct sockaddr{
unisgned short as_family;
char sa_data[14];
};  
iRet= bind(iSocketServer, (const struct sockaddr*)&tSocketServerAddr, sizeof(struct sockaddr));

**注意:**bind的函数原型的第二个参数,是通用地址结构struct sockaddr ,而我们定义结构体地址的时候,一般选择IPv4结构体地址 ,见2.ipv4套接字地址结构 ,例:struct sockaddr_in tSocketServerAddr;

所以当bind()中 ,我们想填入tSocketServerAddr的结构体地址,需要在前面加入强制类型转换(const struct sockaddr*) 将其转换为通用地址结构struct sockaddr。

3、两种地址结构使用场合

struct sockaddr_in  是IPv4地址结构(存放客户端、服务器的地址信息(协议,port,IP))
struct sockaddr    是通用地址结构,不是存放数据,只是socket api类型转换

3.listen监听 并且创建连接队列

​ listen 监听 :等待客户端的连接到来,经过三次握手(底层自动执行),将客户端放入连接队列

#define BACKLOG 10
iRet = listen(iSocketServer,BACKLOG);

功能:

​ 1、将监听套接字由主动变成被动(是在server和client两端 套接字名字一样的情况下,我们这里 设定的 server端的套接字名字是iSocketServer,所以已经是被动。

​ 2、为改套接字创建连接队列,队列长度就是BACKLOG

​ 返回值:成功为0,失败为-1

​ 连接队列,分成完成连接 和未完成连接的状态,分别对应,完成三次握手/第1、 2次握手的状态
初学记录【linux应用】 TCP/UDP 网络编程 C语言,网络,linux,tcp/ip,c语言,udp,vscode

*4.accep 提取客户端的链接

此内容放在while(1)循环里面,表示持续等待客户端连接

iAddrLen=sizeof(struct sockaddr);
iSocketClient= accept(iSocketServer, ( struct sockaddr *)&tSocketClientAddr,  &iAddrLen); //强转是因为socket适用于ipv4、ipv6,通用地址结构强转?

连接成功client的话,打印client的信息

printf("get connect from client %d: %s\n",iClientNum, inet_ntoa(tSocketClientAddr.sin_addr));

iClientNum表示 连接客户端的个数 ,然后inet_ntoa(tSocketClientAddr.sin_addr)是客户端的ip地址 (192.168.xx.xx)要打印出来

然后调用fork()函数对应多个连接的客户端开启多个子进程

5.(send发送) recv 接收客户端的消息**

tcp中recv的注意点

int len =recv(已连接套接字(注意不是监听套接字),buf,sizeof(buf),0);
len 表示recv 收到的实际字节数
如果len为0 ,表示客户端已经断开连接,-1表示 读取数据出错

tcp中send的注意点(C代码放在了client里)

int iSendLen = send(iSocketClient, ucSendBuf, strlen(ucSendBuf), 0);
如果返回值iSendLen >0表示发送成功 ,即实际发送的字节数
如果 为-1 表示发送失败
注意:不能发送0长度报文 ,因为recv收到0长度 会断开连接 (但是udp允许)
iRecvLen = recv(iSocketClient,ucRecvBuf,999 ,0) ;
{
 	ucRecvBuf[iRecvLen]='\0'; //收到的消息加结束符 
	printf("Get Msg from Client %d:%s\n",iClientNum,ucRecvBuf);//打印从which客户端发送的消息
 }

6.close关闭所有套接字

源码阅读

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>



/* socket
 * bind
 * listen
 * accept
 * send/recv
 */
#define Server_port 8888
#define BACKLOG 10

int main(int argc,char**argv)
{
	int iSocketServer;
	int iSocketClient;
	struct sockaddr_in tSocketServerAddr;
	struct sockaddr_in tSocketClientAddr;
	int iRet;
	int iAddrLen;

	int iRecvLen;
	unsigned char ucRecvBuf[1000];

	int iClientNum = -1;
    signal(SIGCHLD,SIG_IGN);
	
	iSocketServer = socket(AF_INET,SOCK_STREAM,0);
	if(-1==iSocketServer)
		{
		printf("socket error!");
		return -1;
		}

	tSocketServerAddr.sin_family = AF_INET;
	tSocketServerAddr.sin_port = htons(Server_port);/*host to net,short*/
	tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;
	memset(tSocketServerAddr.sin_zero , 0, 8);
	iRet= bind(iSocketServer, (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));
	if(iRet==-1)
		{
		printf("bind error!\n");
		return -1;
		}


	iRet = listen(iSocketServer,BACKLOG);
	if(iRet==-1)
		{
		printf("listen error!\n");
		return -1;
		}
        
	while (1)
		{
		iAddrLen=sizeof(struct sockaddr);
		iSocketClient= accept(iSocketServer, ( struct sockaddr *)&tSocketClientAddr,  &iAddrLen);
		if(iSocketClient!=-1)
			{
			iClientNum++;
			printf("get connect from client %d: %s\n",iClientNum, inet_ntoa(tSocketClientAddr.sin_addr));
			if(!fork())
				{//子进程的源码
				while(1)
					{//接收客户端发来的数据并显示出来
					iRecvLen = recv(iSocketClient,ucRecvBuf,999 ,0) ;
					if (iRecvLen<=0)
						{
						close(iSocketClient);
						return -1;
						}
					else 
						{
						ucRecvBuf[iRecvLen]='\0'; 
						printf("Get Msg from Client %d: %s\n",iClientNum,ucRecvBuf);
						}
					}

				}
				
			}
		}
			close(iSocketServer);
			return 0;
	}

TCP 客户端_Client :

1.创建套接字

int iSocketClient=socket(AF_INET, SOCK_STREAM, 0);

2.connect

	tSocketServerAddr.sin_family	  = AF_INET;
	tSocketServerAddr.sin_port		  = htons(SERVER_PORT);  /* host to net, short */
    
	//tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;
	if(inet_aton(argv[1],&tSocketServerAddr.sin_addr)==0)//输入ip成功
  /*
int inet_aton(const char *cp,struct in_addr *inp)
函数里面 a 代表 ascii,n 代表network. 第一个函数表示将a.b.c.d的IP转换为32位的IP,存储在 inp指针里面.
第二个是将32位IP转换为a.b.c.d的格式.
*/
		{
		printf("invalid server_ip\n");
		return -1;
		}
//argv[1] 就是我们运行程序时候 ./client <ip>的 <ip>
	memset(tSocketServerAddr.sin_zero, 0, 8); 

上面是常规的对服务器端的连接信息的信息声明

连接服务器

iRet = connect(iSocketClient, (const struct sockaddr *)&tSocketServerAddr ,sizeof(struct sockaddr));

iSocketClient :发起连接的 套接字

tSocketServerAddr:服务器的地址 , sizeof(struct sockaddr):服务器的地址长度

返回值:成功为0,失败为-1

如果客户端和服务器通信,必须使用connect 事先建立连接

连接成功后,使用while(1)进入循环准备发消息

3.send发送请求 (recv接收应答)

iSendLen = send(iSocketClient, ucSendBuf, strlen(ucSendBuf), 0);

参数:

iSocketClient:客户端的套接字

ucSendBuf:发送的消息

strlen(ucSendBuf):信息的长度

flags ==0

返回值:成功返回发送的字节数,失败返回-1 ,不可以发送0字节的

4.close关闭套接字

源码阅读:

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>



/* socket

 * connect
 * send/recv
   */


int main(int argc ,char**argv)
{
	int iSocketClient ;
	struct sockaddr_in tSocketServerAddr ;
	int iRet;
	unsigned char ucSendBuf[1000];
	int iSendLen;
	

	if (argc!=2)
		{
		prinft("Usage:\n");
		printf("%s<server_ip>\n",argv[0]);
		return -1;
		}
	
	iSocketClient=socket(AF_INET, SOCK_STREAM, 0);
	tSocketServerAddr.sin_family	  = AF_INET;
	tSocketServerAddr.sin_port		  = htons(SERVER_PORT);  /* host to net, short */
	//tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;
	if(inet_aton(argv[1],&tSocketServerAddr.sin_addr)==0)
		{
		printf("invalid server_ip\n");
		return -1;
		}
	memset(tSocketServerAddr.sin_zero, 0, 8);


​	

	iRet = connect(iSocketClient, (const struct sockaddr *)&tSocketServerAddr ,sizeof(struct sockaddr));
	if(-1==iRet)
		{
		printf("connect error\n");
		return -1;
		}
	
	while(1)
		{
			if(fgets(ucSendBuf,999,stdin))
				{
				iSendLen = send(iSocketClient, ucSendBuf, strlen(ucSendBuf), 0);
				if(iSendLen<=0)
					{
					close(iSocketClient);
					return -1;
					}
				}
	
		}

 

 	return 0;

 }


UDP编程

1、特点和应用:

UDP特点:

1.相比TCP速度快 (因为TCP要建立连接,而UDP不需要)

2.简单的请求、应答应用程序可以使用UDP

3.对于海量数据传输不应该使用UDP

4.广播和多播应用必须使用UDP(广播不需要连接)

UDP*应用

DNS(域名解析)、NFS(网络文件系统)、RTP(流媒体

)**

2、网络通信需要解决三大问题(应用层)

协议、端口(port)、IP地址

socket套接字是一个特殊的文件描述符,可以使用open、write、read、close进行网络通信,通过socket函数调用得到这个网络通信的文件描述符(套接字)

3.UDP的编程架构

初学记录【linux应用】 TCP/UDP 网络编程 C语言,网络,linux,tcp/ip,c语言,udp,vscode

4.socket编程的API

1、socket创建通信的套接字

int iSocketServer;
iSocketServer = socket(AF_INET,SOCK_DGRAM,0);

AF_INET 代表ipv4 , AF_INET6代表ipv6

type类型:SOCK_DGRAM(UDP的套接字)、SOCK_STREAM(TCP的套接字),SOCK_RAW(原始套接字)

protocol协议类别:(0、IPPROTO_TCP\IPPROTO_UDP)

返回值:>0 创建的文件描述符 (套接字),<0创建失败

struct sockaddr_in  是IPv4地址结构(存放客户端、服务器的地址信息(协议,port,IP))
struct sockaddr    是通用地址结构,不是存放数据,只是socket api类型转换

2、IPv4套接字地址结构

#include <netinet/in.h>

struct sockaddr_in{
unsigned short sin_family;  //2 字节 协议AF_INET
unsigned short sin_port;    //2字节 端口
struct in_addr sin_addr;	//4字节  IP地址(32位无符号整数)
unsigned char sin_zero[8];  //8字节   全写0
}

struct in_addr:

struct in_addr{
	in_addr_t s_addr;
}

如果使用 Internet 所以 sin_family 一般为 AF_INET。
⚫ sin_addr 设置为 INADDR_ANY 表示可以和任何的主机通信。
⚫ sin_port 是要监听的端口号。
⚫ bind 将本地的端口同 socket 返回的文件描述符捆绑在一起.成功是返回 0,
失败的情况和 socket 一样。

tSocketServerAddr.sin_family = AF_INET;
tSocketServerAddr.sin_port = htons(Server_port);/*host  to net,short*/
tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;//可以和任何的主机通信

3、sendto()

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);

⚫ sendto 和 send 相似,区别在于 sendto 允许在无连接的套接字上指定一个
目标地址。
⚫ dest_addr 表示目地机的 IP 地址和端口号信息,

⚫ addrlen 常常被赋值为 sizeof ( struct sockaddr)。
⚫ sendto 函数也返回实际发送的数据字节长度或在出现发送错误时返回-1。

iSendLen =  sendto(iSocketClient, ucSendBuf , strlen(ucSendBuf) , 0,  (const struct sockaddr *)&tSocketServerAddr , sizeof(struct sockaddr));

**4.recvfrom()**接收消息

如果udp不发数据前就要接收消息,必须对udp套接字进行绑定

recvfrom 函数

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

⚫ recvfrom 通常用于无连接套接字,因为此函数可以获得发送者的地址。

⚫socket:udp套接字,接收消息端 (服务器端)

⚫buffer:用来存放消息的空间起始地址 ,len 是buf的长度,flags = 0 即可

⚫ src_addr 是一个 struct sockaddr 类型的变量,该变量保存源机的 IP 地
址及端口号。 (发送者的ipv4地址信息)
⚫ addrlen 常置为 sizeof ( struct sockaddr)。

返回值:

成功:返回实际收到的字节数 失败:返回-1

iAddrLen = sizeof(struct sockaddr);
		iRecvLen = recvfrom(iSocketServer, ucRecvBuf, 999, 0, (struct sockaddr *)&tSocketClientAddr, &iAddrLen);

成功操作打印

if (iRecvLen > 0)
		{
			ucRecvBuf[iRecvLen] = '\0';
			printf("Get Msg From %s : %s\n", inet_ntoa(tSocketClientAddr.sin_addr), ucRecvBuf);
		}

5.源码阅读

Server.c

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>



/* socket
 * bind
 * send/recv
 */
#define Server_port 8888


int main(int argc,char**argv)
{
	int iSocketServer;
	int iSocketClient;
	struct sockaddr_in tSocketServerAddr;
	struct sockaddr_in tSocketClientAddr;
	int iRet;
	int iAddrLen;

	int iRecvLen;
	unsigned char ucRecvBuf[1000];

	int iClientNum = -1;
	
	
	iSocketServer = socket(AF_INET,SOCK_DGRAM,0);
	if(-1==iSocketServer)
		{
		printf("socket error!");
		return -1;
		}

	tSocketServerAddr.sin_family = AF_INET;
	tSocketServerAddr.sin_port = htons(Server_port);/*host to net,short*/
	tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;

	memset(tSocketServerAddr.sin_zero , 0, 8);
	iRet= bind(iSocketServer, (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));
	if(iRet==-1)
		{
		printf("bind error!\n");
		return -1;
		}
	
	while (1)
		{
		
		iAddrLen = sizeof(struct sockaddr);
		iRecvLen = recvfrom(iSocketServer, ucRecvBuf, 999, 0, (struct sockaddr *)&tSocketClientAddr, &iAddrLen);
		if (iRecvLen > 0)
		{
			ucRecvBuf[iRecvLen] = '\0';
			printf("Get Msg From %s : %s\n", inet_ntoa(tSocketClientAddr.sin_addr), ucRecvBuf);
		}
        }
		close(iSocketServer);
		return 0;
	}

client.c

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>

/* socket
 * connect
 * send/recv
 */

#define SERVER_PORT 8888

int main(int argc, char **argv)
{
	int iSocketClient;
	struct sockaddr_in tSocketServerAddr;
	
	int iRet;
	unsigned char ucSendBuf[1000];
	int iSendLen;

	if (argc != 2)
	{
		printf("Usage:\n");
		printf("%s <server_ip>\n", argv[0]);
		return -1;
	}

	iSocketClient = socket(AF_INET, SOCK_DGRAM, 0);

	tSocketServerAddr.sin_family      = AF_INET;
	tSocketServerAddr.sin_port        = htons(SERVER_PORT);  /* host to net, short */
 	//tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;
 	if (0 == inet_aton(argv[1], &tSocketServerAddr.sin_addr))
 	{
		printf("invalid server_ip\n");
		return -1;
	}
	memset(tSocketServerAddr.sin_zero, 0, 8);

#if 0
	iRet = connect(iSocketClient, (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));	
	if (-1 == iRet)
	{
		printf("connect error!\n");
		return -1;
	}
#endif

	while (1)
	{
		if (fgets(ucSendBuf, 999, stdin))
		{
#if 0
			iSendLen = send(iSocketClient, ucSendBuf, strlen(ucSendBuf), 0);
#else 
            iSendLen =  sendto(iSocketClient, ucSendBuf , strlen(ucSendBuf) , 0,  (const struct sockaddr *)&tSocketServerAddr , sizeof(struct sockaddr));

#endif
			if (iSendLen <= 0)
			{
				close(iSocketClient);
				return -1;
			}
		}
	}
	
	return 0;
}

#参考:
1.韦东山linux编程
2.千锋教育物联网文章来源地址https://www.toymoban.com/news/detail-775842.html

到了这里,关于初学记录【linux应用】 TCP/UDP 网络编程 C语言的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】6.网络编程:网络编程(TCP&UDP)

    网络编程是C++ API操作中很重要的一部分,包含 TCP 和 UDP 。 网络传输模型可以抽象为7个层: 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 。 但在使用TCP/IP协议时,可以简化为这4层: 网络接口、网络层、传输层、应用层 。 TCP:可靠传输,三次握手建立

    2024年02月16日
    浏览(38)
  • 【socket】从计算机网络基础到socket编程——Windows && Linux C语言 + Python实现(TCP+UDP)

    简单讲一下基础知识,便于后面代码的理解,建议大概浏览一下这一小节内容。这里讲的只是冰山一角,建议大家学习计算机网络相关知识,推荐几本书: 《计算机网络》(谢希仁) 《计算机网络 自顶向下方法》 《计算机网络技术》 《计算机网络基础及应用》 《Linux C从入

    2024年02月08日
    浏览(56)
  • 网络编程 —— TCP 和 UDP 编程详解

    目录 网络编程主要函数介绍 1. socket 函数 2. bind 函数 3. listen 函数 4. accept 函数 5. connect 函数 6. send 函数 7. recv 函数 8. recvfrom 函数 9. sendto 函数 TCP 和 UDP 原理上的区别 TCP 编程 服务端代码: 客户端代码: UDP 编程 服务端代码: 客户端代码: 1. socket 函数 int socket(int domain, int

    2024年02月04日
    浏览(41)
  • 网络编程、UDP、TCP

    就是将地理位置不同的具有独立功能的多台计算及外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件以及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 传播交流信息、数据交换、通信 1.如何准确定位网络上的一台主机 192.xxx.xx.xx:端

    2024年03月10日
    浏览(44)
  • 基于TCP、UDP网络编程

    应用层 : 应用程序拿到数据怎么用 传输层 : 负责关注传输过程中起点和终点 网络层 :负责整个传输过程中的路线规划 数据链路层 :负责相邻节点之间的数据传输 物理层 : 基础设施,硬件设备 程序员写网络程序,主要编写的应用层代码,真正要发这个数据,调用下层协

    2024年02月07日
    浏览(47)
  • TCP和UDP网络编程

    TCP和UDP协议是TCP/IP协议的核心。 TCP 传输协议:TCP 协议是一TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠

    2023年04月08日
    浏览(43)
  • UDP和TCP网络编程

    特点: 无连接:发送数据前不需要建立连接。 不可靠:没有重发机制,无法保证数据的可靠性和顺序。 无拥塞控制:发送方发送数据的速度受限于网络的带宽。 快速:由于没有连接建立和拥塞控制的处理,UDP的传输速度通常比TCP快。 简单:UDP协议的头部较小,仅有8个字节

    2024年02月11日
    浏览(42)
  • 网络编程 tcp udp http编程流程 网络基础知识

    OSI分层:应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 tcp/ip: 应用层 传输层 网络层 数据链路 ip地址:唯一标识一台主机 ipv4 32位 ipv6 128位 寻址 可以反映物理上的一个变化 MAC地址:48 固化在计算机中 ip地址又两部分构成:网络号+主机号 端口号:标识一个应用程序

    2024年02月13日
    浏览(71)
  • 【网络编程】TCP,UDP协议详解

    小亭子正在努力的学习编程,接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话,烦请点赞关注支持一波, 感激不尽~~   目录 前言 TCP协议 TCP协议特点 TCP协议通信场景 TCP协议的几个重要机制 一、

    2023年04月19日
    浏览(50)
  • 网络编程(TCP与UDP协议)

    Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并且 Java 实现了一个跨平台的网络库, 程序

    2023年04月27日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包