第25课-UDP通讯程序设计

25.1 UDP编程模型函数化

UDP编程同样是有服务器和客户机的。在服务器中,用到的函数分别是:socket,bind,recvfrom,sendto,close。在客户机上的函数分别是:socket,sendto,recvfrom,close。针对不同的函数,我们只要学习新的函数sendto和recvfrom就好。

1. 发送数据

(1) 函数名

sendto

(2) 函数原型

ssize_t sendto(int sockfd, const void *buf, size_t nbytes, int flags, const struct sockaddr *destaddr, socklen_t destlen);

(3) 函数功能

函数sendto和send很类似。区别在于sendto允许在无连接的套接字上指定一个目标地址。

(4) 所包含的头文件

#include<sys/socket.h>

(5) 返回值

成功:返回发送给的字节数

失败:-1

(6) 参数说明

sockfd:创建套接字的描述符

buf:发送数据所存的地址

bytes:要发送的数据量

flags:发送的标识符

destaddr:数据要发送到的目的的地址

destlen:地址长度

2. 接收数据

(1)函数名

recvfrom

(2)函数原型

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

(3)函数功能

可以得到数据发送者的源地址。

(7) 所包含的头文件

#include<sys/socket.h>

(8) 返回值

成功:已字节计数的消息长度,若无可用消息或对方已经按序结束则返回0

失败:-1

(9) 参数说明

sockfd:创建套接字的描述符

buf:接收到的数据所存的位置

len:接收数据的长度

flags:接收的标志

addr:发送方的地址,读取

addrlen:地址长度的指针

25.2 实例编写

UDP通讯程序设计

udp_server.c

#include<sys/socket.h>

#include<stdio.h>

#include<string.h>  //字符串头文件

#include<netinet/in.h>  //地址的头文件

#define PORT 8888

#define MSG_SIZE 128

int main()

{

int sockfd;

char buffer[128];//定义存储数据的字节

struct sockaddr_in server_addr;

struct sockaddr_in client_addr;

int addrlen;

int n;

//创建套件字

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

//设置要绑定的地址

bzero(&server_addr, sizeof(struct sockaddr_in));//清零

server_addr.sin_family = AF_INET;  //网络协议

server_addr.sin_port = htons(PORT);  //端口,超过两个字节就要转换

server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//表示任意地址,超过两个字节就要转换

//绑定地址

bind(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr));//表示指针的强制转换

//接收数据

while(1)

{

addrlen = sizeof(struct sockaddr);

bzero(buffer, sizeof(buffer));//清零

n = recvfrom(sockfd, buffer, MSG_SIZE, 0, (struct sockaddr *)(&client_addr), &addrlen);

buffer[n] = ‘\0’;

printf("server received: %s\n",buffer);

}

//结束连接

close(sockfd);

return 0;

}

udp_client.c

#include<sys/socket.h>

#include<stdio.h>

#include<string.h>  //字符串头文件

#include<netinet/in.h>  //地址的头文件

#define PORT 8888

#define BUF_SIZE 128

int main(int argc, char **argv)//区分TCP,这节将地址外传进来,也可以在内部完成固定地址

{

int sockfd;

char buffer[BUF_SIZE];//定义存储数据的字节

struct sockaddr_in server_addr;

if(argc !=2)//我们希望的输入是,程序名+IP地址,如果不对的话,输入提示信息

{

printf("usage: %s server_ip\n ",argv[0]);

exit(1);

}

//创建套件字

sockfd = socket(AF_INET, SOCK_DGRAM, 0);//和服务器的定义一样

//初始化服务器地址

bzero(&server_addr, sizeof(struct sockaddr_in));//清零

server_addr.sin_family = AF_INET;  //网络协议

server_addr.sin_port = htons(PORT);  //端口,超过两个字节就要转换

inet_aton(argv[1],server_addr.sin_addr);                /*将argv[1]的内容转换后传给server_addr.sin_addr并且直接转换成网络字节序*/

//发送数据

while(1)

{

printf("please input char!\n");

fgets(buffer, BUF_SIZE,stdin);

sendto(sockfd, buffer, strlen(buffer),0, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr));

bzero(buffer, BUF_SIZE);//清零

}

//结束连接

close(sockfd);

return 0;

}

运行:

在复制的终端中分别运行两个编译好的文件。注意格式分别是:./udp_server和./udp_client 192.168.153.128(网络地址根据实际的情况而定)。在udp_client终端输入字符,在udp_server终端可以打印传输过来的字符。

转载于:https://www.cnblogs.com/free-1122/p/11357306.html

第三季-第25课-UDP通讯程序设计相关推荐

  1. UDP通讯协议广播和组播实现

    UDP 通讯协议广播 UDP广播发送端 #include "myhead.h" int main(int argc,char **argv) {     int udpsock; ...

  2. LWIP裸机环境下实现TCP与UDP通讯(转)

    源: LWIP裸机环境下实现TCP与UDP通讯

  3. 基于Delphi API写的UDP通讯类

    转载地址:http://www.codefans.net/articles/159.shtml 基于Delphi API写的UDP通讯类,可以广播和单播,类作者:王彦鹏.这个类是作者2007年的时候写 ...

  4. LWIP裸机环境下实现TCP与UDP通讯

    前面移植了LWIP,并且简单的实用了DHCP的功能,今天来使用一下实际的数据通讯的功能 首先是实现TCP客户端,我先上代码 #ifndef __TCP_CLIENT_H_ #define __TCP_ ...

  5. linux系统udp通信程序,Linux UDP socket编程(UDP通讯模型) | C/C++程序员之家

    Linux UDP socket编程(UDP通讯模型): UDPClient + UDPService. Linux下大多数网络程序都是基于TCP的,很少基于UDP,简单的通讯模型如下,开发时候备用! ...

  6. C#UDP通讯UdpClient

    目录(?)[+] 遇到如下两个问题 远程主机强迫关闭了一个现有的连接的错误 [html] view plaincopy print? class UdpClientClass { /// <su ...

  7. 宁波医院计算机试题及答案,(宁波市第25届小学生计算机程序设计竞赛试题及答案.doc...

    (宁波市第25届小学生计算机程序设计竞赛试题及答案 宁波市第25届中小学生程序设计竞赛组初赛试题 1.在宁波市中小学生程序设计比赛复赛(上机编程)时,以下不能使用的编程语言是: (A)Turbo Pa ...

  8. UDP 通讯协议 局域网通信发送消息 简单实现

    发送端 import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; imp ...

  9. 《和码中文》第一册词组(共25课)

    <和码中文>第一册词组(共25课) 每课词组选择要求: 1.词组中的字都是已学过的单字,或本课中学习的单字: 2.每个词组最好至少含一个本课学习的单字: 3.词组要有易读,又有一定的正面意 ...

  10. UDP通讯之字节流与protobuf转换(C++版)

    UDP通讯之字节流与protobuf转换(C++版) 说明 工程内容 VS2017工程介绍 VS2017工程基本设置 数据结构体 UDP服务端server与客户端client类的封装 初始化IP与Po ...

最新文章

  1. 《构建之法》读后感之项目计划
  2. 【Spring注解系列11】Spring后置处理器BeanPostProcessor用法与原理
  3. 四大价值观和12准则
  4. resteasy_RESTEasy教程第2部分:Spring集成
  5. selenium webdriver (6) -- iFrame
  6. 基础算法---二分查找
  7. python3 datatime,python3处理时间和日期:datetime模块 – Python3教程
  8. python识别图片文字、并返回文字坐标_简易OCR图片文字识别工具的进一步改进(增加显示图片的功能)...
  9. Excel数据批量导入导出(基础版)
  10. python:实现恩尼格玛密码机算法(附完整源码)
  11. 阿里巴巴宣布传承计划,没有马云的阿里会如何?
  12. 微信企业号(公众号)开发流程汇总
  13. 查看linux系统是centos还是ubuntu的方法
  14. 手算前推回代求解潮流电压分布
  15. 网易前端微专业课程讨论区问答精选
  16. 荷兰国旗、quillksort
  17. 在Google Doc不可用的时候,见识了Google的18国语言道歉, 力压苹果5国
  18. 双向链表 - DoubleLinkedList
  19. 电表远程抄表在配电房内的使用
  20. 胸口的疤痕增生怎么去掉好

热门文章

  1. 实习踩坑之路:parallelStream并发流+快速失败导致线上CPU300%的血泪史
  2. 数据结构---堆的相关操作
  3. Hexo+GitHub搭建个人博客
  4. 设计模式-04-行为型模式详解
  5. Picasso源码的简单解析(二)
  6. Windows下编译FFmpeg
  7. 关于直播,所有的技术细节都在这里了(二)
  8. 集群服务器分布式iis_使用nginx实现分布式限流的方法
  9. python random模块安装_Python中的For循环和Random模块
  10. 创建分布式爬虫的步骤