c udp服务器端一对多持续接收消息,Web新技术 实验3-4+UDP服务器编程

实验实验3 4 UDP服务器编程服务器编程 实验日期 实验日期 一 实验目的一 实验目的 1 熟悉socket函数 2 了解udp服务器编程的基本框架 3 使用socket函数实现简单的udp服务端和客户端程序及他们之间的通信 二 实验环境二 实验环境 1 带网络连接的Linux系统 实验室的环境为Ubuntu 三 实验原理三 实验原理 1 迭代服务器框架 s so oc ck ke et t s so oc ck ke et t w wr ri it te e c cl lo os se e r re ea ad d b bi in nd d c cl lo os se e w wr ri it te e r re ea ad d 数据请求 数据响应 关闭连接 UDP服务器 客户端 2 涉及的头文件 include include include include include include include include 3 涉及的系统函数 accept 确认外来连接 并将它与一个立即建立的数据套接字联系起来 原始 套接字返回到监听状态 bind 给未命名套接字赋一个本地名 closesocket 从进程对象参考表中删去一个套接字 只有当SO LINGER设置时才 阻塞 connect 在指定套接字上初始化连接 getsockname 获取指定套接字的当前名字 getsockopt 获取与指定套接字相关的选项 htonl 将一个32位数从主机字节顺序转换为网络字节顺序 htons 将一个16位数从主机字节顺序转换为网络字节顺序 inet addr 将一个用网际标准点分表示法表示的字符串地址转换成网际地址值 inet ntoa 将一个网际地址值转换成一个用点分十进制表示法表示的字符串地址 ioctlsocket 为套接字提供控制 listen 在指定套接字上监听外来连接 ntohl 将一个32位数从网络字节顺序转换为主机字节顺序 ntohs 将一个16位数从网络字节顺序转换为主机字节顺序 recv 从一个连接的套接字上接收数据 recvfrom 从一个连接或未连接的套接字上接收数据 select 执行多路同步I O send 给一个连接套接字发送数据 sendto 给一个连接或未连接套接字发送数据 setsockopt 设置与指定套接字相关的选项 shutdown 关闭全双工连接的一部分 socket 建立一个通讯用的末端点 返回一个套接字 三 实验步骤三 实验步骤 1 实现UDP服务器的服务端和客户端程序 服务器接收客户端发送的字符串信 息并显示 同时显示客户端的IP地址 端口号 并向客户端发送信息 如果服 务器接收的客户信息为 BYE 则退出循环 并关闭套接字 例如例如 服务器端的IP为113 42 67 90 端口为20000 客户端的IP为113 42 67 91 客户端向服务器发送字符串 hello root machine client 113 42 67 90 hello 服务器端打印出客户端发送过来的字符串 hello 并显示出客户端的ip地址和 端口号 root machine listening from the client receive message from the client ip 113 42 67 91 port message hello 服务端参考代码服务端参考代码 include include include include include include include include define PORT 20000 define BUFFERSIZE 100 int main int argc char argv int sockfd struct sockaddr in server struct sockaddr in client socklen t addrlen char buf BUFFERSIZE 创建udp的socket if sockfd socket AF INET SOCK DGRAM 0 1 printf create socket error n return 1 memset server sin family AF INET server sin port htons PORT server sin addr s addr htonl INADDR ANY 绑定服务器的socket到本地的一个端口 if bind sockfd struct sockaddr return 1 addrlen sizeof client int num 0 while 1 从客户端接收消息 num recvfrom sockfd buf sizeof buf 0 struct sockaddr if num 0 printf recvfrom error n exit 1 打印客户端的ip地址 端口和发送的消息 printf Clent s IP s n inet ntoa client sin addr printf Clent s port d n ntohs client sin port printf Clent s message s n buf 向客户端发送一条消息 表示消息已经成功收到 sendto sockfd message received welcome n 9 0 struct sockaddr if strcmp buf BYE break close sockfd return 0 保存为 udp server cpp 编译 g udp server cpp o server 运行 server 客户端参考代码 客户端参考代码 include include include include include include include include include define PORT 20000 define BUFFERSIZE 100 int main int argc char argv int sockfd num char buf BUFFERSIZE struct hostent he struct sockaddr in server peer if argc 3 printf Usage s n argv 0 return 1 if he gethostbyname argv 1 NULL printf gethostbyname error n return 1 创建udp的socket if sockfd socket AF INET SOCK DGRAM 0 1 printf socket error n return 1 bzero 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 addrlen sizeof server while 1 从服务器端接收消息 存到buf中 if num recvfrom sockfd buf sizeof buf 0 struct sockaddr exit 1 if addrlen sizeof server memcmp const void continue buf num 0 printf Server Message s n buf break close sockfd 保存为 udp client cpp 编译 g udp client cpp o client 运行 client 113 2 修改你的代码 使服务端能够接收客户端发送的整形数据 并在服务器端打 印出来 注意字节序的转换问题 如果客户端没有转换整数的字节序就发送给 服务器端 服务器能否正常处理 我修改了部分代码 定义了一个一维数组number 里面包含了两个元素 1 2 在客户端里我直接发送给服务器端 sendto sockfd number sizeof number 0 struct sockaddr 服务器对于BUF的定义也进行了相应的修改 并且使用下面方法输出 printf Clent s IP s n inet ntoa client sin addr printf Clent s port d n ntohs client sin port printf Clent s message d d n buf 0 buf 1 printf over n buf 测试结果均正常 客户端能正常发送 服务器端也可以正常接收

展开阅读全文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值