计算机网络实验

简单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. arp嗅探(windows)

    本次实验环境:windows本次实验工具:cain汉化版1.点击配置,嗅探器里选一个适配器,点击确定. 2.点击 3.扫描mac地址 4.点击ARP->嗅探器->添加到列表5.点击开始嗅探 ...

  2. 简单的新手加法运算(基于Struts2)

    软件151  王帅 在搭好框架的前提下,首先编写action.java文件: import com.opensymphony.xwork2.ActionSupport; public class Us ...

  3. Linux中一个文件10行内容,如何输出5-8内容到屏幕

    题目是这样的,Linux中一个文件10行内容,如何输出5-8内容到屏幕首先我们模拟一下这样的环境: [root@localhost question]# pwd /root/question [roo ...

  4. 记-统计svn与git的log日志中的代码行变更

    任务要求 统计指定时间内,指定git地址与svn地址上的所有人员的代码行变更情况. 解决方案 最初为根据数据库中存储的所有git与svn地址来统计所有人员的提交代码行.之后由于库中存储的地址不全,改为 ...

  5. python 提取字符串中的指定字符 正则表达式

    例1: 字符串: '湖南省长沙市岳麓区麓山南路麓山门' 提取:湖南,长沙 在不用正则表达式的情况下: address = '湖南省长沙市岳麓区麓山南路麓山门' address1 = address.s ...

  6. 获取.properties后缀的数据

    在MyPro.properties中的数据如下: Name=ABC 测试类中: Properties properties = new Properties(); String configFile ...

  7. 关于Apache的配置方法和步骤

    一.下载.安装和卸载 网址:https://httpd.apache.org/docs/current/platform/windows.html#down 点击ApacheHaus,在里面下载任何版 ...

  8. tp5.0中使用PHPexcel,以及Loader的一些问题

    在5.0中使用PHPexcel遇到一些问题,记录一下方便以后查看. 非使用PHPexcel的方法: 参考:http://blog.csdn.net/sinat_35861727/article/det ...

  9. 查询数据库:models.Books.objects.all()[10: 20]与models.Books.objects.filter(id__gt=10, id__lt=20).values() 的区别

    1. models.Books.objects.all()[10: 20] (10:20  之间是冒号,不是逗号.)查出的是 QuerySet对象,如需进行操作,得进一步进行剥皮. 查询代码: 查询结 ...

  10. MySQL父子节点查询

    MySQL父子结点递归查询 表结构: CREATE TABLE `agency` ( `id` ) NOT NULL COMMENT '编号', `name` ) NOT NULL COMMENT ' ...