UDP

来源:互联网 发布:抖腿的坏处 知乎 编辑:程序博客网 时间:2024/05/16 17:33

一、UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

二、UDP 客户端&服务端
1、 使用的系统调用
ssize_t sendto(int socket, void *message, size_t length, int flags,
struct sockaddr *dest_addr, socklen_t dest_len);

ssize_t recvfrom(int socket, void *buffer, size_t length, int flags,
struct sockaddr *address, socklen_t *address_len);

1 、服务端
recvfrom
socket 监听描述符
buffer 接受的数据buf
length buf大小
flags 0
address 当recvfrom接收到数据时,保存客户端地址信息,sendto时使用此结构体
address_len sockaddr结构体体大小


sendto
socket 监听描述符
message 发送的数据buf
length 发送数据大小
flags 0
dest_addr 客户端scokaddr_in结构体
dest_len sockaddr 结构体大小


2、 客户端
sendto
socket 描述符
message 发送的数据buf
length 发送数据大小
flags 0
dest_addr 服务端scokaddr_in结构体,填写服务端地址和端口等信息
dest_len sockaddr 结构体大小

recvfrom
socket 描述符
buffer 接受的数据buf
length buf大小
flags 0
address 服务端scokaddr_in结构体,从服务端接受数据
address_len sockaddr结构体体大小


server.c

#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/types.h>          /* See NOTES */#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <fcntl.h>#define BUF_SIZE 100int main(){//socketint iServer = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == iServer){return -1;}printf("create socket ok\r\n");//bindstruct sockaddr_in stServer;memset(&stServer, 0, sizeof(struct sockaddr_in));stServer.sin_family = AF_INET;stServer.sin_port = htons(8888);stServer.sin_addr.s_addr = INADDR_ANY;int iRet = bind(iServer, (struct sockaddr *)&stServer, sizeof(struct sockaddr_in));if (-1 == iRet){return -1;}printf("bind ok\r\n");//recvfrom sendtochar buf[BUF_SIZE] = {0};struct sockaddr_in stClient;socklen_t tLen = sizeof(struct sockaddr_in);while(1){memset(buf, 0, BUF_SIZE);memset(&stClient, 0, sizeof(struct sockaddr_in));iRet = recvfrom(iServer, buf, BUF_SIZE, 0, (struct sockaddr *)&stClient, &tLen);if (iRet > 0){printf("server : %s\r\n", buf);sendto(iServer, buf, BUF_SIZE, 0, (struct sockaddr *)&stClient, tLen);}}return 0;}
client.c

#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/types.h>          /* See NOTES */#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <fcntl.h>#define BUF_SIZE 100int main(){//socketint iClient = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == iClient){return -1;}printf("create socket ok\r\n");struct sockaddr_in stServer;memset(&stServer, 0, sizeof(struct sockaddr_in));stServer.sin_family = AF_INET;stServer.sin_port = htons(8888);stServer.sin_addr.s_addr = inet_addr("127.0.0.1");//recvfrom sendtochar buf[BUF_SIZE] = {0};struct sockaddr_in stClient;socklen_t tLen = sizeof(struct sockaddr_in);int iRet = -1;while(1){memset(buf, 0, BUF_SIZE);memset(&stClient, 0, sizeof(struct sockaddr_in));gets(buf);iRet = sendto(iClient, buf, BUF_SIZE, 0, (struct sockaddr *)&stServer, tLen);if (iRet > 0){memset(buf, 0, BUF_SIZE);recvfrom(iClient, buf, BUF_SIZE, 0, (struct sockaddr *)&stClient, &tLen);printf("client : %s\r\n", buf);}}return 0;}



1 0
原创粉丝点击