udp用户数据报协议的实现
来源:互联网 发布:日购网怎么样知乎 编辑:程序博客网 时间:2024/06/11 17:49
1 udp的简介
UDP—用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
2 实现udp所使用的函数
socket 函数:创建一个通信点,返回一个文件描述符
#include <sys/types.h> #include <sys/socket.h>int socket(int domain, int type, int protocol);
在第一个参数应该是AF_INET ,第二个参数中SOCK_DGRAM ,创建一个udp套接字.
bind函数:为套接口分配一个本地IP和协议端口,对于网际协议,协议地址是32位IPv4地址或128位IPv6地址与16位的TCP或UDP端口号的组合;如指定端口为0,调用bind时内核将选择一个临时端口,如果指定一个通配IP地址,则要等到建立连接后内核才选择一个本地IP地址。
bind()的作⽤是将参数sockfd和server绑定在⼀起,使sockfd这个⽤于⽹络通讯的⽂件描述符监听server所描述的地址和端口号。
#include <sys/socket.h> int bind(int sockfd, const struct sockaddr * server, socklen_t addrlen);
recvfrom函数:用来接收数据,从sockfd处接收,将数据存放在buf内,接受len个数据。
#include <sys/types.h> #include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
sendto函数:UDP使用sendto()函数发送数据,发送到sockfd处,发送buf里的内容,发送len个。
#include <sys/types.h>#include <sys/socket.h>ssize_t sendto(int sockfd, const void *buf, size_t len,\int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
3 udp_server.c
#include<stdio.h> #include<string.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<stdlib.h> #include<netinet/in.h> #include<arpa/inet.h> #define PORT 1234 #define MAXDATASIZE 100 int main() { int sockfd; struct sockaddr_in server; struct sockaddr_in client; socklen_t addrlen; int num; char buf[MAXDATASIZE]; if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("Creatingsocket failed."); exit(1); } bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(PORT); server.sin_addr.s_addr= htonl (INADDR_ANY); if(bind(sockfd, (struct sockaddr *)&server, sizeof(server)) == -1) { perror("Bind() error."); exit(1); } addrlen=sizeof(client); while(1) { num =recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr*)&client,&addrlen); if (num < 0) { perror("recvfrom() error\n"); exit(1); } buf[num] = '\0'; printf("You got a message (%s%) from client.\n \ It's ip is%s, port is %d.\n",buf,\ inet_ntoa(client.sin_addr),htons(client.sin_port)); sendto(sockfd,buf,sizeof(buf),0,\ (struct sockaddr *)&client,addrlen); if(!strcmp(buf,"bye")) break; } close(sockfd);}
4 udp_client
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #define PORT 1234 #define MAXDATASIZE 100 int main(int argc, char *argv[]) { int sockfd, num; char buf[MAXDATASIZE]; struct hostent *he; struct sockaddr_in server,peer; if (argc !=3) { printf("Usage: %s <IP Address><message>\n",argv[0]); exit(1); } if ((he=gethostbyname(argv[1]))==NULL) { printf("gethostbyname()error\n"); exit(1); } if ((sockfd=socket(AF_INET, SOCK_DGRAM,0))==-1) { printf("socket() error\n"); exit(1); } bzero(&server,sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(PORT); server.sin_addr= *((struct in_addr *)he->h_addr); sendto(sockfd, argv[2],strlen(argv[2]),0,(struct \sockaddr *)&server,sizeof(server)); socklen_t addrlen; addrlen=sizeof(server); while (1) { if((num=recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr *)&peer,&addrlen))== -1) { printf("recvfrom() error\n"); exit(1); } if (addrlen != sizeof(server) ||memcmp((const void *)&server, (const void *)&peer,addrlen) != 0) { printf("Receive message from otherserver.\n"); continue; } buf[num]='\0'; printf("Server Message:%s\n",buf); break; } close(sockfd); }
5.运行结果
阅读全文
0 0
- udp用户数据报协议的实现
- UDP用户数据报协议
- UDP 用户数据报协议
- UDP:用户数据报协议
- UDP:用户数据报协议
- UDP -- 用户数据报协议
- 用户数据报协议 UDP
- UDP用户数据报协议
- UDP:用户数据报协议
- 用户数据报协议UDP
- 用户数据报协议UDP
- 用户数据报协议UDP
- UDP:用户数据报协议
- 用户数据报协议UDP
- 用户数据报协议(UDP) (转)
- 第十四章:用户数据报协议(UDP)
- (11)UDP:用户数据报协议
- 第十一章 UDP:用户数据报协议
- 求正整数的位数,依次输出,逆序打印
- 回溯法之递归回溯和迭代回溯
- java中JTextArea添加滚动条
- 源码(三)
- Codeforces 479E Riding in a Lift DP+前缀和
- udp用户数据报协议的实现
- python爬虫抓取MM图(www.mmjpg.com)
- 模拟窗口消息队列
- git pull冲突
- :-1: 错误:cannot open output file release/first.exe: Permission denied
- 【PAT】【Advanced Level】1004. Counting Leaves (30)
- 百度地图
- 录屏软件 gif
- 关于取消浮动影响的多种方法及优缺点比较