实验平台

linux

实验内容

编写UDP服务器和客户端程序,客户端发送消息,服务器接收消息,并打印客户端的IP地址和端口号。

实验原理

UDP是无需连接的通信,其主要实现过程如下:

同样,我们可以按照上一篇博客:基于TCP的客户端和服务器端的代码设计 的办法,将服务器代码分成两部分,一个是初始化,一个是收发数据。但是UDP服务器初始化较为简单,也可以直接写在main函数里。

UDP和TCP在读写数据上较为不同的是,sendto()和recvfrom(),这两个函数较为复杂。通过man手册查询得到:

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);

参数1:文件描述符;  参数2:要发送的buf数据,是个指针
参数3:目的地的地址,是个指针,在使用时需要强制类型转换成(struct sockaddr *)  参数4:目的地的地址长度。具体的例子看下面代码

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);

参数1:文件描述符;  参数2:要接收的buf缓冲区

参数3:接收的来源地址,在使用时需要强制类型转换成(struct sockaddr *)  参数4:一个指针,指向地址长度。具体的例子看下面代码

服务器端代码:udpserver.c

#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> #define BUFFER_SIZE 100
#define PORT 1234 int32_t main(int32_t argc,char *argv[])
{
struct sockaddr_in server;
struct sockaddr_in client;
char buf[BUFFER_SIZE];
int32_t len = sizeof(client);
int32_t ret = ;
int32_t file_len = ; if (argc != )
{
printf("Usage ./server [ip]\n");
return -;
}
int32_t sockfd = socket(AF_INET, SOCK_DGRAM, );
if (sockfd < )
{
perror("create socket failed!");
exit();
} bzero(&server, sizeof(struct sockaddr_in));
server.sin_family = AF_INET;
server.sin_port = htons(PORT); /**< 主机字节序转化成网络字节序 */
server.sin_addr.s_addr = inet_addr(argv[]); /**< 字符串转换in_addr的函数 */ /**< 绑定服务器 */
if (bind(sockfd, (struct sockaddr *)&server, sizeof(server)) < )
{
perror("bind failed!");
exit();
} ret = recvfrom(sockfd, buf, BUFFER_SIZE, , (struct sockaddr *)&client, &len);
if (ret < )
{
perror("recvfrom failed!");
exit();
}
buf[ret] = '\0';
printf("client message: %s\n", buf);
printf("client's ip is %s, port is %d.\n", inet_ntoa(client.sin_addr), htons(client.sin_port)); /**< 向客户端发送信息 */
if (sendto(sockfd, "Welcome to server", BUFFER_SIZE, , (struct sockaddr *)&client, len) < )
{
perror("send file len to client error");
} close(sockfd);
return ;
}

客户端代码:udpclient.c

#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> #define BUFFER_SIZE 100
#define PORT 1234 int32_t main(int argc,char *argv[])
{
struct sockaddr_in server;
struct sockaddr_in peer;
char buf[BUFFER_SIZE];
int32_t len = sizeof(peer);
char sendbuf[BUFFER_SIZE] = "welcome to client";
int32_t num = ; if (argc != )
{
printf("Usage ./client ip\n");
exit();
}
int sockfd = socket(AF_INET, SOCK_DGRAM, );
if (sockfd < )
{
perror("create socket failed!");
exit();
}
bzero(&server, sizeof(struct sockaddr_in));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = inet_addr(argv[]); if (sendto(sockfd, sendbuf, BUFFER_SIZE, , (struct sockaddr *)&server, sizeof(server)) < )
{
perror("sendto socket failed!");
exit();
} if ((num = recvfrom(sockfd, buf, BUFFER_SIZE, , (struct sockaddr *)&peer, &len)) < )
{
perror("recvfrom socket failed!");
exit();
} buf[num] = '\0';
printf("Server Message: %s\n", buf); close(sockfd); return ;
}

Makefile

all:server client

server:udpserver.c
gcc udpserver.c -o server client:udpclient.c
gcc udpclient.c -o client clean:
rm -rf server client

实验结果

最新文章

  1. spring的AOP
  2. 激活webstorm2016如何激活webstorm2016永久激活webstorm2016
  3. CentOS6.5安装nginx及负载均衡配置
  4. db2官方SQLSTATE代码提示
  5. Asp.Net MVC页面静态化功能实现一:利用IHttpModule,摒弃ResultFilter
  6. NFS介绍和安装
  7. 第五章 MySQL函数
  8. 用git工作的流程
  9. Python全栈-magedu-2018-笔记9
  10. 20172308《Java软件结构与数据结构》第一周学习总结
  11. SQL 2008 R2 收缩日志,不用修改简单模式
  12. Fisher精确检验【转载】
  13. shell_script1
  14. XCode快捷键 转
  15. c++中的前向声明
  16. HttpClient学习之 客户端HTTP编程入门
  17. 解决virtualbox共享文件夹没有访问权限的问题
  18. 2015/11/1用Python写游戏,pygame入门(1):pygame的安装
  19. UIViewController三种不同的初始化view的方式
  20. asp.net—— 基础之截取字符串

热门文章

  1. SpringBoot系列(五)Mybatis整合完整详细版
  2. Python爬虫利器 cURL你用过吗?
  3. System.out.println()的真实含义
  4. [一起读源码]走进C#并发队列ConcurrentQueue的内部世界 — .NET Core篇
  5. Jquery+php鼠标滚动到页面底部自动加载更多内容,使用分页
  6. L20 梯度下降、随机梯度下降和小批量梯度下降
  7. python基础-json、pickle模块
  8. sudo -s 命令 [oh-my-zsh] 提示检测到不安全目录
  9. [转+自]SSH工作原理
  10. 初识phar反序列化&amp;&amp;复现bytectf_2019_easycms&amp;&amp;RSS思路