实验平台

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

实验结果

基于UDP的客户端和服务器端的代码设计的更多相关文章

  1. 基于TCP的客户端和服务器端的代码设计

    实验平台 linux 实验内容 编写TCP服务器和客户端程序,程序运行时服务器等待客户端连接.一旦连接成功,服务器显示客户端的IP地址和端口号,并向客户端发送字符串 实验原理 TCP是面向连接的通信, ...

  2. UDP广播的客户端和服务器端的代码设计

    实验环境 linux 注意: 使用UDP广播,是客户端发送广播消息,服务器端接收消息.实际上是客户端探测局域网中可用服务器的一种手段.客户端发送,服务器端接收,千万不能弄混淆!!! 为了避免混淆,本文 ...

  3. C/S模型:TCP,UDP构建客户端和服务器端(BIO实现

    Java中提供了socket编程来构建客户端和服务器端 TCP构建服务器端的步骤:(1)bind:绑定端口号(2)listen:监听客户端的连接请求(3)accept:返回和客户端连接的实例(4)re ...

  4. 基于UDP传输协议局域网文件接收软件设计 Java版

    网路传输主要的两大协议为TCP/IP协议和UDP协议,本文主要介绍基于UDP传输的一个小软件分享,针对于Java网络初学者是一个很好的练笔,大家可以参考进行相关的联系,但愿能够帮助到大家. 话不多说, ...

  5. 基于TCP的客户端、服务器端socket编程

    一.实验目的 理解tcp传输客户端服务器端通信流程 二.实验平台 MAC OS 三.实验内容 编写TCP服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP地址.端口号,并 ...

  6. 使用CXF开发WebService程序的总结(四):基于bean的客户端和服务端代码的编写

    1. 在原服务端项目 ws_server中添加两个bean 1.1 添加两个类  User 和 Clazz   package com.lonely.pojo; public class User { ...

  7. QT 使用QUdpSocket QUdpServer UDP 建立客户端与服务器端

    1. 模拟天气监控,每隔两秒从Server发送天气信息到Client. 2. 示例代码 --------------------------- Server 端 ------------------- ...

  8. 计算机网络课设之基于UDP协议的简易聊天机器人

    前言:2017年6月份计算机网络的课设任务,在同学的帮助和自学下基本搞懂了,基于UDP协议的基本聊天的实现方法.实现起来很简单,原理也很简单,主要是由于老师必须要求使用C语言来写,所以特别麻烦,而且C ...

  9. 【TCP/IP网络编程】:06基于UDP的服务器端/客户端

    本篇文章简单描述了UDP传输协议的工作原理及特点. 理解UDP UDP和TCP一样同属于TCP/IP协议栈的第二层,即传输层. UDP套接字的特点 UDP的工作方式类似于传统的信件邮寄过程.寄信前应先 ...

随机推荐

  1. Vue-CLI 3.x 自动部署项目至服务器

    前言 平时部署前端项目流程是:先部署到测试环境ok后再发布到生产环境上,部署到测试环境用 xshell 连上服务器,然后用 xftp 连接服务器,然后本地 build 项目,接着把 build 好的文 ...

  2. C++语言实现双向链表

    这篇文章是关于利用C++模板的方式实现的双向链表以及双向链表的基本操作,在之前的博文C语言实现双向链表中,已经给大家分析了双向链表的结构,并以图示的方式给大家解释了双向链表的基本操作.本篇文章利用C+ ...

  3. 解决idea导入maven项目缺少jar包的问题

    之前一直用的elipse,现在用idea不熟悉,这里记录一下.这里以idea2017为例. 导入elipse的maven项目,提示缺少jar包,肯定是idea没有给你导包. 第一步,首先确认自己的id ...

  4. Linux中vim编辑器 的 快捷键 --- 常用 的 都比较全

    Linux中vim编辑器的功能非常强大,许多常用快捷键用起来非常方便,这里将我学vim入门时学的一些常用的快捷键分享给大家一下,希望可以帮助你们. 这个是我将鸟哥书上的进行了一下整理的,希望不要涉及到 ...

  5. Feature list, Standard and Test plan for BETA Release 12/22/2015

    ===================BETA RELEASE FEATRURE LIST==================== 1. Log in and account manager for ...

  6. BUG 测试计划

       性能追求 目前状况 测试标准 APP平稳运行,无crush现象   快速下拉翻页时,崩溃退出     要求多人使用,均流畅无异常退出方可               页面的放大缩小不会造成页面显 ...

  7. Sprint 2 : ios图形界面设计与代码整合

    这周我们主要focus在personal photo experience 项目的ios图形界面设计与代码整合工作上. 工作进度: 1. 图形界面设计方面:兆阳和敏龙基本已经将ios手机客户端的雏形界 ...

  8. C - Battle City BFS+优先队列

    Many of us had played the game "Battle city" in our childhood, and some people (like me) e ...

  9. 基础_TCP/IP

    概念明确: 1:TCP/IP代表传输控制协议/网际协议,指的是一系列协议  为什么会叫TCP/IP.因为用的多, 2:HTTP 是属于应用层的协议 3:OSI七层模型和TCP/IP 平等,只是TCP/ ...

  10. [apue] getopt 可能重排参数

    看第21章时,介绍到了解析命令行的神器 getopt,了解了 linux 下处理通用命令行的方法. 命令行可分为参数与选项,其中不带 - 或 -- 前缀的为参数,对一个命令而言数量是固定的,多个参数之 ...