详情解析TCP与UDP传输协议
详情解析TCP与UDP传输协议,博智网带你了解详细信息 。
【详情解析TCP与UDP传输协议】目录
- 一、什么是 socket ?
- 二、Socket 编程的重要概念
- ① IP 地址
- ② TCP/IP 端口
- ③ 协议
- 三、socket 编程的 API 接口
- ① Linux 下的 socket API 接口
- ② windows 下的 socket API 接口
- ③ TCP、UDP 通信的 socket 编程流程图
- 四、socket 的应用实例
- ① 基于 TCP 的本地客户端、服务端信息交互实例
- ② 基于 UDP 的本地客户端、服务端信息交互实例
一、什么是 socket ?
Socket 的英文原义是“孔”或“插座” 。在编程中 , Socket 被称做套接字 , 是网络通信中的一种约定 。Socket 编程的应用无处不在 , 我们平时用的 QQ、、浏览器等程序 , 都与 Socket 编程有关 。
那么我们使用浏览器查资料 , 这个过程的技术原理是怎样的呢?如下所示:







② 基于 UDP 的本地客户端、服务端信息交互实例windows 的程序
服务端程序 udp_server.c:
#include <stdio.h> #include <winsock2.h>#define BUF_LEN100int main(void) {WSADATA wd;SOCKET ServerSock;char Buf[BUF_LEN] = {0};SOCKADDR ClientAddr;SOCKADDR_IN ServerSockAddr;int addr_size = 0;/* 初始化操作sock需要的DLL */WSAStartup(MAKEWORD(2,2),&wd);/* 创建服务端socket */if(-1 == (ServerSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))){printf("socket error!\n");exit(1);}/* 设置服务端信息 */memset(&ServerSockAddr, 0, sizeof(ServerSockAddr));// 给结构体ServerSockAddr清零ServerSockAddr.sin_family = AF_INET;// 使用IPv4地址ServerSockAddr.sin_addr.s_addr = htonl(INADDR_ANY);// 自动获取IP地址ServerSockAddr.sin_port = htons(1314);// 端口/* 绑定套接字 */if (-1 == (bind(ServerSock, (SOCKADDR*)&ServerSockAddr, sizeof(SOCKADDR)))){printf("bind error!\n");exit(1);}addr_size = sizeof(SOCKADDR);while (1){/* 接受客户端的返回数据 */int str_len = recvfrom(ServerSock, Buf, BUF_LEN, 0, &ClientAddr, &addr_size);printf("客户端发送过来的数据为:%s\n", Buf);/* 发送数据到客户端 */sendto(ServerSock, Buf, str_len, 0, &ClientAddr, addr_size);/* 清空缓冲区 */memset(Buf, 0, BUF_LEN);}/*如果有退出循环的条件 , 这里还需要清除对socket库的使用*//* 关闭服务端套接字 *///closesocket(ServerSock);/* WSACleanup();*/return 0; }
客户端程序 udp_client.c:
#include <stdio.h> #include <winsock2.h>#define BUF_LEN100int main(void) {WSADATA wd;SOCKET ClientSock;char Buf[BUF_LEN] = {0};SOCKADDR ServerAddr;SOCKADDR_INServerSockAddr;int ServerAddrLen = 0;/* 初始化操作sock需要的DLL */WSAStartup(MAKEWORD(2,2),&wd);/* 创建客户端socket */if (-1 == (ClientSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))){printf("socket error!\n");exit(1);}/* 向服务器发起请求 */memset(&ServerSockAddr, 0, sizeof(ServerSockAddr));ServerSockAddr.sin_family = PF_INET;ServerSockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");ServerSockAddr.sin_port = htons(1314);ServerAddrLen = sizeof(ServerAddr);while (1){printf("请输入一个字符串 , 发送给服务端:");gets(Buf);/* 发送数据到服务端 */sendto(ClientSock, Buf, strlen(Buf), 0, (struct sockaddr*)&ServerSockAddr, sizeof(ServerSockAddr));/* 接受服务端的返回数据 */recvfrom(ClientSock, Buf, BUF_LEN, 0, &ServerAddr, &ServerAddrLen);printf("服务端发送过来的数据为:%s\n", Buf);memset(Buf, 0, BUF_LEN);// 重置缓冲区}closesocket(ClientSock);// 关闭套接字// WSACleanup();/*如果有退出循环的条件 , 这里还需要清除对socket库的使用*/return 0; }
Linux 下的程序
服务端程序 linux_udp_server.c:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h>#define BUF_LEN100int main(void) {int ServerFd;char Buf[BUF_LEN] = {0};struct sockaddr ClientAddr;struct sockaddr_in ServerSockAddr;int addr_size = 0;int optval = 1;/* 创建服务端socket */if ( -1 == (ServerFd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))){printf("socket error!\n");exit(1);}/* 设置服务端信息 */memset(&ServerSockAddr, 0, sizeof(ServerSockAddr));// 给结构体ServerSockAddr清零ServerSockAddr.sin_family = AF_INET;// 使用IPv4地址ServerSockAddr.sin_addr.s_addr = htonl(INADDR_ANY);// 自动获取IP地址ServerSockAddr.sin_port = htons(1314);// 端口// 设置地址和端口号可以重复使用if (setsockopt(ServerFd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0){printf("setsockopt error!\n");exit(1);}/* 绑定操作 , 绑定前加上上面的socket属性可重复使用地址 */if (-1 == bind(ServerFd, (struct sockaddr*)&ServerSockAddr, sizeof(ServerSockAddr))){printf("bind error!\n");exit(1);}addr_size = sizeof(ClientAddr);while (1){/* 接受客户端的返回数据 */int str_len = recvfrom(ServerFd, Buf, BUF_LEN, 0, &ClientAddr, &addr_size);printf("客户端发送过来的数据为:%s\n", Buf);/* 发送数据到客户端 */sendto(ServerFd, Buf, str_len, 0, &ClientAddr, addr_size);/* 清空缓冲区 */memset(Buf, 0, BUF_LEN);}close(ServerFd);return 0; }
推荐阅读
- vivot1采用什么处理器?vivot1处理器性能详情介绍
- 小米POCOM4Pro跑分?小米POCOM4Pro跑分详情
- tcp和udp的区别
- iQOONeo6SE怎么样?iQOONeo6SE参数配置详情介绍
- 荣耀x30i怎么样?荣耀x30i参数配置详情介绍
- 2003年生肖属羊人一生命运解析
- 属龙人运势解析
- 7岁女孩遭37名家长联合驱逐怎么回事?背后详情真相曝光
- 华为WatchGT3外观渲染图?华为WatchGT3外观详情
- 天玑1200ai参数?天玑1200ai参数性能详情
