UDP与TCP简单实现
网络通信协议:
网络通信中最重要的就是网络通信协议,网络通信协议是一种网络通用语言,为连接不同操作系统和不同硬件体系结构的互联网络提供通信支持。
简单点,网络协议就是网络之间进行沟通、交流的桥梁,只有相同网络协议的计算机才能进行信息的沟通与交流。就像人与人之间一样,只有使用相同语言的人才能进行正常的交流与沟通。
常见的网络通信协议有: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;
}