计算机网络实验

简单UDP套接字编程

这是学校老师自己改进了一点的题目。我预习了好久才搞明白,同学来问的时候,一大堆简单问题实在是不想回答...所以,这时候我觉得博客是个好东西!

我的任务是做客户端和服务器,并通过修改服务器,实现在客户端输入GetTime,然后经过服务器返回当前系统时间

首先,Ubuntu系统

这个是不可少的,因为我们学的这个套接字就是在ubuntu上实现的,我是装的ubuntu16.04,没条件的装虚拟机也可以。

此次UDP套接字程序步骤

  1. 创建套接字
  2. 命名套接字
  3. 在服务器上,等待消息
  4. 在客户端上,发送消息
  5. 将响应发送回客户端
  6. 关闭套接字

    具体程序不给出,网上参考有很多,为了节省时间,老师给的代码,虽然有自己修改的,但是不敢发出来,毕竟老师还是很牛批的,万一找到我追究责任,那我不扯犊子了嘛。所以主要写写例如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套接字编程 返回系统时间的更多相关文章

  1. 计算机网络实验 UDP套接字编程

    这是个傻瓜式操作教程 西科大计算机网络实验 UDP套接字编程 我用自己的Ubuntu16.04来举例,实验室的是虚拟机,差不多 只针对第三个题目,修改服务器来通过响应客户端发送的GetTime并发送给 ...

  2. 探索UDP套接字编程

    UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...

  3. 【转】 探索UDP套接字编程

    UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...

  4. TCP和UDP套接字编程 (java实现)

    在了解网络编程之前,我们先了解一下什么叫套接字 套接字即指同一台主机内应用层和运输层之间的接口 由于这个套接字是建立在网络上建立网络应用的可编程接口 因此也将套接字称为应用程序和网络之间的应用程序编程 ...

  5. 《Unix 网络编程》08:基本UDP套接字编程

    基本UDP套接字编程 系列文章导航:<Unix 网络编程>笔记 UDP 概述 流程图 recvfrom 和 sendto #include <sys/socket.h> ssi ...

  6. 【Python网络编程】利用Python进行TCP、UDP套接字编程

    之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...

  7. JavaTCP和UDP套接字编程

    在我们刚开始入门Java后端的时候可能你会觉得有点复杂,包含了很多杂七杂八的知识,例如文件上传下载,监听器,JDBC,请求重定向,请求转发等等(当然也没有很多),但是我们自己真正的去开发一个小型网站( ...

  8. 【Unix网络编程】chapter8基本UDP套接字编程

    chapter8基本UDP套接字编程 8.1 概述 典型的UDP客户端/服务端的函数调用 8.2 recvfrom和sendto函数 #include <sys/socket.h> ssi ...

  9. java基础----->TCP和UDP套接字编程

    这里简单的总结一下TCP和UDP编程的写法,另外涉及到HttpUrlConnection的用法 . TCP套接字 一.项目的流程如下说明: .客户输入一行字符,通过其套接字发送到服务器. .服务器从其 ...

随机推荐

  1. rabbitmq 日志存储路径

    Linux      下/var /log/rabbitmq/ windows下C:\Users\Administrator\AppData\Roaming\RabbitMQ\log

  2. 基于mykernel完成多进程的简单内核

    学号351 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ mykernel简介 mykernel是由孟宁老师建立的一个用于开发您自己的操 ...

  3. C#Mvc4.0IIS部署(内网)

    安装IIS(百度中搜索教程安装) 在Vs中将项目发布到文件夹 回到桌面,右键计算机=>管理=>服务和应用程序=>Internet信息服务(IIS)管理器 右键添加新网站,输入网站名称 ...

  4. 字符串的顺序倒置。(Reverse)

    实际遇到的问题:在串口获取码表数据的时候,有的码表传到电脑上的数字顺序是颠倒的,即:123.45,会显示为54.321.需要重新处理数据.方法很多,也不难实现,现在列举其中5个. public str ...

  5. 总结Jquery中获取自定义属性使用.attr()和.data()以及.prop()的区别

    一..attr()和.data()的区别: .attr()和.data()本质上属于DOM属性和Jquery对象属性的区别. 看一个例子: <!DOCTYPE html> <html ...

  6. RAID阵列盘有一块状态变为外来处理方法

    感谢: https://blog.csdn.net/cmzsteven/article/details/63680933

  7. mongo aggregate 删除重复数据

    $group 按照什么排序, 关照 _id 这个是排序的依据 $match 这个从排序的结果内抽取 count 大于一的 allDiskUse  如果内存配置比较小, 设置这个才能运行, 否则会崩. ...

  8. 20175224 2018-2019-2 《Java程序设计》第八周学习总结

    教材学习内容总结 第十五章 泛型与集合框架 泛型 泛型:目的为建立具有类型安全的集合框架. 泛型类声明:class People<E> class 名称<泛型列表> 链表 定义 ...

  9. ef 增加或者更新的习惯思维

    首先申明是我的习惯思维,经常这样写: var item=db.tableName.FirstOrDefault(ii=>....); if(item==null) { item=new ...; ...

  10. Vue语法学习第五课——条件渲染

    ① v-if .v-else-if .v-else <div v-if="type === 'A'"> A </div> <div v-else-if ...