欢迎来到军工软件开发人才培养基地——学到牛牛

UDP与TCP简单实现

时间:2024-05-06 07:01:10 来源:学到牛牛

 

网络通信协议:

网络通信中最重要的就是网络通信协议,网络通信协议是一种网络通用语言,为连接不同操作系统和不同硬件体系结构的互联网络提供通信支持。

简单点,网络协议就是网络之间进行沟通、交流的桥梁,只有相同网络协议的计算机才能进行信息的沟通与交流。就像人与人之间一样,只有使用相同语言的人才能进行正常的交流与沟通。

常见的网络通信协议有:UDP、TCP、ICMP、HTTP、HTTPS、FTP等。Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,面向连接的是 TCP。

 

UDP网络通信:

UDP是用户数据报协议(User Datagram Protocol),它为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。并且UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。

但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。一般应用于:周期性的状态信息、图片和视频数据传输、局域网内数据传输。

UDP实现的编码思路:先创建一个套接字,然后对其进行绑定(绑定本机IP地址与端口号)。完成绑定之后即可进行数据的传入或者传出,最后在所有事情结束之后即可关闭套接字。

编码如下:

write.c:

#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <unistd.h>

#include <netinet/in.h>

#include <arpa/inet.h>

 

int main()

{

int sock = socket( AF_INET,  SOCK_DGRAM,  0 ); // 创建套接字,AF_INET为IPV4协议

// SOCK_DGRAM为数据报

struct sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_port = htons(9978); // 此处端口号可以自己设置,一般在5000以上

addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 填写本机IP地址

bind( sock, (struct sockaddr *)&addr, sizeof(addr) ); // 绑定

 

int len = sizeof(addr);

char buf[1024] = {0};

scanf( "%s", buf );

sendto( sock, buf, sizeof(buf), 0, (struct sockaddr *)&addr, len ); // 将buf里面的数据发送出去

 

close( sock ); // 关闭套接字

return 0;

}

 

read.c:

#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <unistd.h>

#include <netinet/in.h>

#include <arpa/inet.h>

 

int main()

{

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

 

struct sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_port = htons(9978);

addr.sin_addr.s_addr = inet_addr("127.0.0.1");

bind( sock, (struct sockaddr *)&addr, sizeof(addr) );

 

struct sockaddr_in addr1;

int len = sizeof(addr1);

char buf[1024] = {0};

recvfrom( sock, buf, sizeof(buf), 0, (struct sockaddr *)&addr1, &len );

printf( "%s \n", buf );

 

close( sock );

return 0;

}

 

TCP网络通信:

TCP是传输控制协议(Transmission Control Protocol),比较像打电话。无连接、不可靠、无序、效率高、资源要求低。

TCP实现的编码思路:大致思路与UDP网络通信一致,只是TCP网络通信分客户端与服务端,服务端需要监听。

编码如下:

server.c:

#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <unistd.h>

#include <netinet/in.h>

#include <arpa/inet.h>

 

int main()

{

int sock = socket( AF_INET,  SOCK_STREAM,  0 ); // 创建套接字,SOCK_STREAM为数据流

 

struct sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_port = htons(9978);

addr.sin_addr.s_addr = INADDR_ANY;

bind( sock, (struct sockaddr *)&addr, sizeof(addr) ); // 绑定

 

listen( sock, 6 ); // 设置最大同时可连接的客户端数

 

int len = sizeof(addr);

int fd = accept( sock, (struct sockaddr *)&addr, &len ); // 接纳客户端连接请求

char buf[1024] = {0};

read( fd, buf, 1024 ); // 读取客户端发送过来的数据

printf( "%s \n", buf );

 

close( fd );

close( sock );

return 0;

}

 

client.c:

#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <unistd.h>

#include <netinet/in.h>

#include <arpa/inet.h>

 

int main()

{

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

 

struct sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_port = htons(9978);

addr.sin_addr.s_addr = inet_addr("127.0.0.1");

 

connect( sock, (struct sockaddr *)&addr, sizeof(addr) ); // 绑定

 

char buf[1024] = {0};

scanf( "%s", buf );

write( sock, buf, 1024 ); // 向服务器发送数据

 

close( sock );

return 0;

}