UDP套接字编程 返回系统时间
计算机网络实验
简单UDP套接字编程
这是学校老师自己改进了一点的题目。我预习了好久才搞明白,同学来问的时候,一大堆简单问题实在是不想回答...所以,这时候我觉得博客是个好东西!
我的任务是做客户端和服务器,并通过修改服务器,实现在客户端输入GetTime,然后经过服务器返回当前系统时间
首先,Ubuntu系统
这个是不可少的,因为我们学的这个套接字就是在ubuntu上实现的,我是装的ubuntu16.04,没条件的装虚拟机也可以。
此次UDP套接字程序步骤
- 创建套接字
- 命名套接字
- 在服务器上,等待消息
- 在客户端上,发送消息
- 将响应发送回客户端
- 关闭套接字
具体程序不给出,网上参考有很多,为了节省时间,老师给的代码,虽然有自己修改的,但是不敢发出来,毕竟老师还是很牛批的,万一找到我追究责任,那我不扯犊子了嘛。所以主要写写例如sendto,recvfrom之类的用法。
1.创建套接字
使用系统命令socket来创建套接字
int socket(int domain, int type, int protocol);
里面三个参数具体类型我还没搞懂,就不发了emmm
2.命名套接字
创建的套接字不能直接使用,要对其进行命名,使用系统的bind进行命名,给该套接字关联一个IP和端口号
int bind(int socket, const struct sockaddr *address, size_t address_len);
socket:服务器或者客户端自己创建的socket
address:服务器或者客户端自己的地址信息(协议族、IP、端口号)
address_len:服务器或者客户端自己的地址信息的长度
3. 在服务器上,等待消息
在服务器通过recvfrom接收来自客户端的消息,请记住我们接下来要修改服务器代码实现返回时间的就是在这一步后面修改代码。
服务器在循环里面不断调用recvfrom函数,接收客户的数据,并输出接收到的客户数据的长度和具体内容。
int recvfrom(int socket, void *buffer, size_t length, int flags, struct sockaddr *src_addr, socklen_t *src_len);
socket:标识一个已连接套接口的描述字。
buffer:接收数据缓冲区。
length:缓冲区长度。
flags:调用操作方式。
src_addr:(可选)指针,指向装有源地址的缓冲区。
src_len:(可选)指针,指向from缓冲区长度值。
以上是普通的套接字编程,在此次实验中还要求了修改服务器代码来实现返回客户端的是系统时间。所以这里我们主要注意一下buffer;
4.在客户端上,发送消息
UDP是无连接的,所以客户端可以直接向服务器发送消息,通过sendto向服务器发送
int sendto(int socket, const void *buffer, size_t length, int flags, const struct sockaddr *dest_addr, socklen_t dest_len);
socket:一个标识套接口的描述字。
buffer:包含待发送数据的缓冲区。
length:buf缓冲区中数据的长度。
flags:调用方式标志位。
dest_addr:(可选)指针,指向目的套接口的地址。
dest_len:to所指地址的长度。
5.将响应发送回客户端
依旧通过sendto将响应发回客户端由客户端recvform后输出
6.关闭套接字
可以使用系统的close关闭套接字
close();
以上那些内容网上都可以搜到,也许比我还详细。所以我们这个主要要的在修改服务器代码,将给客户端发送的数据更改为系统时间
题目是在客户端输入GetTime然后显示系统时间。输入其他字符串,返回原字符串
还是之前让注意的recvfrom里面的buffer,这是我们要判断的,在服务器接收的内容存在buffer中,而recvform返回的值我们设为n,这是buffer的长度,也就是你输入的字符存在于buffer中.
我们可以建立一个time_p[]来存你要对比的字符串,也就是GetTime,但是要注意的是你在客户端输入的数据基本上是带有回车的,这样单纯的对比是会出错的,因为自己设置的对比用数组不含有回车.
所以我们要在预设的数组中添加回车。这个过程中要时刻注意自己的数组和读取的客户端发来的数组的结束标志和换行。
只需要在用strcmp判断出接收的数据和自己预存的数据是否一样,是则将缓存区数据更改为系统时间(这一步要记住通过strlen判断字符串长度并修改n,因为我们发送给客户端时要用缓冲区长度,如果不修改,会导致发送的数据缺失),否则直接返回。
补充时间函数
#include<stdio.h>
#include<time.h>
int main()
{
time_t timep;
time (&timep);
printf("%s",ctime(&timep));
return 0;
}
这是我自己修改服务器时更改的部分代码,有变动。而且,值得注意的是因为是在死循环里不断接收客户端发来的数据,我出现了数据有些重复了上次输入的。所以最好还是在死循环内用memset清空一下buffer。我清空后就避开了这个错误。
char time_p[] = "GetTime\n";
time_t timep;
time (&timep);
if(strcmp(buffer,time_p) == 0)
{
memset(buffer,0,sizeof(mesg));
strcpy(buffer,ctime(&timep));
k = strlen(buffer);
buffer[k] = '\r';
buffer[k+1] = '\0';
n = k+1;
}
说实话,这个预习还真是恶心。。。因为没接触过,“弄清”这些函数花了好久。还一大堆东西没弄明白。
仓促写个这玩意。难免有错误,发现请指出。。。
最后的最后,给个参考网址
UDP套接字编程 返回系统时间的更多相关文章
- 计算机网络实验 UDP套接字编程
这是个傻瓜式操作教程 西科大计算机网络实验 UDP套接字编程 我用自己的Ubuntu16.04来举例,实验室的是虚拟机,差不多 只针对第三个题目,修改服务器来通过响应客户端发送的GetTime并发送给 ...
- 探索UDP套接字编程
UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...
- 【转】 探索UDP套接字编程
UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...
- TCP和UDP套接字编程 (java实现)
在了解网络编程之前,我们先了解一下什么叫套接字 套接字即指同一台主机内应用层和运输层之间的接口 由于这个套接字是建立在网络上建立网络应用的可编程接口 因此也将套接字称为应用程序和网络之间的应用程序编程 ...
- 《Unix 网络编程》08:基本UDP套接字编程
基本UDP套接字编程 系列文章导航:<Unix 网络编程>笔记 UDP 概述 流程图 recvfrom 和 sendto #include <sys/socket.h> ssi ...
- 【Python网络编程】利用Python进行TCP、UDP套接字编程
之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...
- JavaTCP和UDP套接字编程
在我们刚开始入门Java后端的时候可能你会觉得有点复杂,包含了很多杂七杂八的知识,例如文件上传下载,监听器,JDBC,请求重定向,请求转发等等(当然也没有很多),但是我们自己真正的去开发一个小型网站( ...
- 【Unix网络编程】chapter8基本UDP套接字编程
chapter8基本UDP套接字编程 8.1 概述 典型的UDP客户端/服务端的函数调用 8.2 recvfrom和sendto函数 #include <sys/socket.h> ssi ...
- java基础----->TCP和UDP套接字编程
这里简单的总结一下TCP和UDP编程的写法,另外涉及到HttpUrlConnection的用法 . TCP套接字 一.项目的流程如下说明: .客户输入一行字符,通过其套接字发送到服务器. .服务器从其 ...
随机推荐
- 9ci
- spring为什么推荐使用构造器注入
一.前言 项目中遇到一个问题:项目启动完成前,在A类中注入B类,并调用B类的某个方法. 那么调用B类的这个方法写在哪里呢,我选择写到构造器里,但是构造器先于Spring注入执行,那么执行构造器时, ...
- spring(spring mvc)整合WebSocket案例(获取请求参数)
开发环境(最低版本):spring 4.0+java7+tomcat7.0.47+sockjs 前端页面要引入: <script src="http://cdn.jsdelivr.ne ...
- Android系统中是否开启定位及定位模式的判断
1.关于Android系统中不同的定位模式 Android系统中包括3中定位模式: 使用GPS.WLAN和移动网络 使用WLAN和移动网络 仅使用GPS 截图 特点 同时使用GPS.WIFI及基站 ...
- spring cloud微服务下手动回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 这里使用的场景是,跨服务调用接口,比如:用户信息和用户积分 ...
- tomcat8常用配置说明
链接:https://www.jianshu.com/p/8b1c75951f70 2.tomcat8运行期错误HTTP头解析错误 修改tomcat的server.xml中的中配置 设置为8k &l ...
- CrashHandler
CrashHandler 全局Crash捕获处理
- 进制与ASCII码转换
LabeledEdit4.Text := chr(); // 用十进制方式赋值: ASCII码转换为字符 65 -> A LabeledEdit4.Text := #; // 用十进制方式赋值: ...
- 存储过程 传 datatable
首先 定义 datatable 然后把要传的数据放到table里面 调用 存储过程 传递参数
- socket.io 实现简易聊天
客户端: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...