计算机网络实验

简单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. PHP调用Python接口过程中所遇到的问题

    在php调用python脚本时,首先把python相关组件安装完善.用Python命令检测运行脚本而不报错. 在调用接口的过程 1.没有打开的python脚本的权限 解决办法:把python脚本所在的 ...

  2. Python中对字符串的操作

    Python字符串的相关操作 1.字符串格式判断 s.isalnum() #所有字符都是数字或者字母 s.isalpha() #所有字符都是字母 s.isdigit() #所有字符都是数字 s.isl ...

  3. 第八次作业:聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

    import numpy as np x = np.random.randint(1,100,[20,1]) y = np.zeros(20) k = 3 def initcenter(x,k): r ...

  4. JAVA 平时作业一

    public class Print { public static void main (String arg[]) { for(int i=0;i<16;i++) { for(int j=0 ...

  5. 本地pip 源搭建起来

    pip install pip2pi pip2tgz target_dir -r requirement.txt 下载想要的本地的py包  /usr/local/python3/bin/dir2pi ...

  6. java的重写

    重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能够根据需要实现父类的方法 ...

  7. oracle 根据一个表更新另一个表内容

    declarecursor c_col is select * from xtgl_jgmcbm where substr(v_jgbm,0,2)in('41');--v_sjbm in( selec ...

  8. javascript 禁用 右键 按键 禁用开发者工具

    var h = window.innerHeight,w=window.innerWidth; //禁用右键 (防止右键查看源代码) window.oncontextmenu=function(){ ...

  9. winform程序读取和改写配置文件App.config元素的值

    winform程序读取和改写配置文件App.config元素的值 2016-05-16 17:49 by newbirth, 2412 阅读, 0 评论, 收藏, 编辑 1 2 3 4 5 6 7 & ...

  10. pypi镜像源加速第三方库在线安装

    使用pypi镜像源加速第三方库在线安装 用easy_install和pip来安装第三方库很方便 它们的原理其实就是从Python的官方源pypi.python.org/pypi 下载到本地,然后解包安 ...