简单UDP传输代码

简单UDP传输代码
简单UDP传输代码

//UDPcilentCEHO 文件传输客户端

#pragma comment(lib,"ws2_32.lib")

#include

#include

#include

#define MAX_BUF 65536

#define K_BUF 256

int main()

{

//初始化

WSAData wsaData;

int err=WSAStartup(WINSOCK_VERSION,&wsaData);

if(0!=err)

{

return -1;

}

SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);

if(sock == INV ALID_SOCKET)

{

printf("socket() Failed: %d\n", WSAGetLastError());

WSACleanup();

return -1;

}

//char destIP[] = "10.3.120.137";

char destIP[] = "172.17.195.174";

unsigned short destPort = 20000;

sockaddr_in destAddr;

destAddr.sin_family = AF_INET;

destAddr.sin_port = htons(destPort);

destAddr.sin_addr.s_addr = inet_addr(destIP);

printf("UDPclientCEHO had startup ! \n");

char data[]="Hello world ! ";

int sByte;

sByte = sendto(sock,data, strlen(data), 0, (sockaddr *)&destAddr, sizeof(destAddr));

if(sByte == SOCKET_ERROR)

{

printf("sendto() Failed: %d\n", WSAGetLastError());

closesocket(sock);

WSACleanup();

getchar();

return -1;

}

printf("client sendto server [%d]data : %s\n",sByte,data);

char readBuf[MAX_BUF];

int rByte;

sockaddr_in remoteAddr;

int remoteLen = sizeof(remoteAddr);

memset(readBuf, 0, MAX_BUF);

rByte = recvfrom(sock, readBuf, MAX_BUF, 0, (sockaddr *)&remoteAddr, &remoteLen);

if(rByte == SOCKET_ERROR)

{

printf("recv() Failed: %d\n", WSAGetLastError());

closesocket(sock);

WSACleanup();

return -1;

}

printf("client recv server [%d]data : %s\n",rByte,readBuf);

closesocket(sock);

WSACleanup();

return 0;

}

//UDPserverFileUDP文件传输服务器端

// Socket_echo_Server.cpp : 定义控制台应用程序的入口点。

//#include

#pragma comment(lib,"ws2_32.lib")

#include

#include

#include

#define MAX_BUF 65536

int main()

{

WSAData wsaData;

int err = WSAStartup(WINSOCK_VERSION, &wsaData);

if(0 != err)

{

return -1;

}

SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);

if(sock == INVALID_SOCKET)

{

printf("socket() Failed: %d\n", WSAGetLastError());

WSACleanup();return -1;

}

unsigned short destPort = 20000;

sockaddr_in localAddr;

localAddr.sin_family = AF_INET;

localAddr.sin_port = htons(destPort);

localAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

err = bind(sock, (sockaddr *)&localAddr, sizeof(localAddr));

if(err == SOCKET_ERROR)

{

printf("bind() FAILED: %d\n", WSAGetLastError());

closesocket(sock);WSACleanup();

return -1;

}

printf("Waiting for client ...\n");

char readBuf[MAX_BUF];

memset(readBuf, 0, MAX_BUF);

sockaddr_in remoteAddr;

int sByte;

int rByte;

int remoteLen;

remoteLen = sizeof(remoteAddr);

rByte = recvfrom(sock, readBuf, MAX_BUF, 0, (sockaddr *)&remoteAddr, &remoteLen); if(rByte == SOCKET_ERROR)

{

printf("recv() Failed: %d\n", WSAGetLastError());

closesocket(sock);

WSACleanup();

return -1;

}

printf("server recv client [%d]data

from %s : %s\n",rByte,inet_ntoa(remoteAddr.sin_addr),readBuf);

sByte = sendto(sock,readBuf, strlen(readBuf), 0, (sockaddr *)&remoteAddr, sizeof(remoteAddr));

if(sByte == SOCKET_ERROR)

{

printf("sendto() Failed: %d\n", WSAGetLastError());

closesocket(sock);

WSACleanup();

getchar();

return -1;

}

printf("server sendto client [%d]data : %s\n",sByte,readBuf);

closesocket(sock);

WSACleanup();

return 0;

}

C语言课程设计 简单计算器程序

课程设计名称:C语言课程设计课程设计题目:简单计算器程序

目录 第1章需求分析 (1) 1.1设计要求 (1) 1.2任务 (1) 第2章总体设计 (2) 2.1设计简介及设计方案论述 (2) 2.2功能模块层次图 (2) 第3章详细设计 (3) 3.3由(后缀)逆波兰表达式计算中缀表达式原理 (8) 3.3.1算法描述 (8) 第4章调试分析 (10) 4.1程序设计中所遇到的错误及犯错的原因 (10) 4.2错误的解决方法 (10) 第5章用户手册 (11) 总结 (15) 参考文献 (16) 附录(程序清单) (17)

第1章需求分析 1.1 设计要求 (1)用 C 语言数据结构实现程序设计; (2)利用结构体、栈、进行相关信息处理; (2)系统的各个功能模块要求用函数的形式实现; (4)界面简单,可操作性高。 1.2任务 (1)定义一个结构体类型数组,输入0~9 及+、--、*等符号的信息,将其信息存储起来; (2)输入简单的加减乘除算术计算式,并在屏幕上显示逆波兰(后缀式)表达式和计算结果; (3)编写代码; (4)程序分析与调试。 说明: 本课程设计将实现一个简单计算器。在功能上尽量模仿windows 的计算器。系统界面不做牵制要求。该程序能实现标准型中+、-、*、/、(、)、.、的混合运算表达式(一般意义上的中缀表达式),将其转换成逆序波兰表达式(后缀表达式)并计算输出结果。在进行运算后可以选择继续运算或者结束当前运算。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。

第2章 总体设计 2.1设计简介及设计方案论述 逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相 关的两个运算对象之间,所以,这种表示法也称为中缀表达式。波兰逻辑学家 J.Lukasiewicz 于 1929 年提出了另一种表示表达式的方法。按此方法,每一运算符都置 于其运算对象之后,故称为后缀表达式。 后缀表达式的优点是显而易见的, 编译器在处理时候按照从左至右的顺序读取逆波 兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实 际编程的时候就会体会到它的好处了。 逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转 换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运 算级别的特殊处理。 2.2功能模块层次图 将算术表达式转化为逆波兰表达式 计算逆波兰表达式的值 简单计算器 表 达 式 格 式 转 换 系统 求 值 计 算 系 统

C语言程序设计 入门源代码代码集合

#include <> void print_star(void) { printf("*****************\n"); } void print_welcome(void) { printf("C language,welcome!\n"); } void main() { print_star(); print_welcome(); print_star(); getchar(); } 演示2 #include "" int sum(int i,int j) { return(i + j); } void main() { int n1,n2; printf("input 2 numbers:\n"); scanf("%d%d",&n1,&n2); printf("the sum = %d\n",sum(n1,n2)); getchar(); } 演示3 #include "" int maxnum(int,int,int); main() { int a,b,c; printf("Please enter 3 numbers:\n"); scanf("%d,%d,%d",&a,&b,&c); printf("Maxnum is %d\n",maxnum(a,b,c));

} int maxnum(int x,int y,int z) { int max=x; if(y>max) max = y; if(z>max) max = z; return max; } 演示4 #include <> int s1(int n) { int j,s; s=0; for(j=1;j<=n;j++) s=s+j; return s; } int sum(int n) { int i,s=0; for(i=1;i<=n;i++) s=s+s1(i); return s; } void main() { int n; printf("n:"); scanf("%d",&n); printf("s=%d\n",sum(n)); } 演示5

Linux下基于socket的文件传输程序设计课程报告

Linux高级开发 课程设计报告 课程设计题目:Linux下基于socket的文件传输程序设计 学院:________信息工程学院_____________ 专业班级:________网络工程_____________ 年级:________级_____________________ 姓名:____________________________ 学号:________201______________ 完成时间:___2015___年____12___月_____25__日 成绩:__________________________________ 指导教师:____________________________

项目分 值 优秀 (100>x≥90) 良好 (90>x≥80) 中等 (80>x≥70) 及格 (70>x≥60) 不及格 (x<60) 评 分参考标准参考标准参考标准参考标准参考标准 学习态度15 学习态度认 真,科学作风 严谨,严格保 证设计时间并 按任务书中规 定的进度开展 各项工作 学习态度比较 认真,科学作 风良好,能按 期圆满完成任 务书规定的任 务 学习态度 尚好,遵守 组织纪律, 基本保证 设计时间, 按期完成 各项工作 学习态度尚 可,能遵守组 织纪律,能按 期完成任务 学习马虎, 纪律涣散, 工作作风 不严谨,不 能保证设 计时间和 进度 技术水平 与实际能力25 设计合理、理 论分析与计算 正确,实验数 据准确,有很 强的实际动手 能力、经济分 析能力和计算 机应用能力, 文献查阅能力 强、引用合理、 调查调研非常 合理、可信 设计合理、理 论分析与计算 正确,实验数 据比较准确, 有较强的实际 动手能力、经 济分析能力和 计算机应用能 力,文献引用、 调查调研比较 合理、可信 设计合理, 理论分析 与计算基 本正确,实 验数据比 较准确,有 一定的实 际动手能 力,主要文 献引用、调 查调研比 较可信 设计基本合 理,理论分析 与计算无大 错,实验数据 无大错 设计不合 理,理论分 析与计算 有原则错 误,实验数 据不可靠, 实际动手 能力差,文 献引用、调 查调研有 较大的问 题 创新10 有重大改进或 独特见解,有 一定实用价值 有较大改进或 新颖的见解, 实用性尚可 有一定改 进或新的 见解 有一定见解观念陈旧 论文(计算 书、图纸)撰写质量50 结构严谨,逻 辑性强,层次 清晰,语言准 确,文字流畅, 完全符合规范 化要求,书写 工整或用计算 机打印成文; 图纸非常工 整、清晰 结构合理,符 合逻辑,文章 层次分明,语 言准确,文字 流畅,符合规 范化要求,书 写工整或用计 算机打印成 文;图纸工整、 清晰 结构合理, 层次较为 分明,文理 通顺,基本 达到规范 化要求,书 写比较工 整;图纸比 较工整、清 晰 结构基本合 理,逻辑基本 清楚,文字尚 通顺,勉强达 到规范化要 求;图纸比较 工整 内容空泛, 结构混乱, 文字表达 不清,错别 字较多,达 不到规范 化要求;图 纸不工整 或不清晰 指导教师评定成绩: 指导教师签名:年月日

简单的四则运算计算器程序

简单的四则运算计算器程序

注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。 2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。

附件:程序源代码 // sizheyunsuan.cpp : Defines the entry point for the console application. #include #include const int MAX=100; class Operand{ private: double operS; public: Operand(){} Operand(double opers){ operS=opers; } void set(double opers){ operS=opers; } double get() { return operS;} }; class Operator{ private: char operF; int priority; public: Operator(){} Operator(char operf) { operF=operf; switch(operf) { case'(':priority=-1;break; case'+':priority=0;break; case'-':priority=0;break; case'*':priority=1;break; case'/':priority=1;break; case')':priority=2;break; } } void set(char operf){ operF=operf; } char get(){ return operF;} int getpriority(){ return priority; } };

广工计算机网络课设基于UDP的ping.doc

《计算机网络》课程设计 学院 ____计算机学院 _______ 专业 ______软件工程 _______ 年级班别 ______12 级 4 班 _______ 学号91 学生姓名指导教师______ ____ 林炳城 梁路 _ __ ___ ________ 成绩

目录

设计题目 已知技术参数和设计要 求 设计内容与 步骤 设计工作计划与进度安 排 计算机网络课程设计任务书 编程实现基于UDP 的 PING (Java) 1.编程实现 PING 的服务器端和客户端,实现操作系统提供的 ping 命令的类似功能。 2.服务器端PingServer 功能: 可以显示用户通过客户端发送来的消息内容(包含头部和payload); 能够模拟分组的丢失;能够模拟分组传输延迟; 将用户发送来的请求request 在延迟一段随机选择的时间(小于 1s)后返回给客户端,作为收到请求的响应reply; 通过如下命令行启动服务器:java PingServer port 。 port 为 PingServer 的工作端口号 3.客户端 PingClient功能: 启动后发送10 个 request。发送一个request 后,最多等待 1 秒以便接收PingServer 返回的 reply 消息。如果在该时间内没有收到服务器的reply ,则认为该请求或对该请求的 reply 已经丢失;在收到 reply 后立即发送下一 个 request。 请求消息的payload 中至少包含关键字PingUDP 、序号、时间戳等内容。 如: PingUDP SequenceNumber TimeStamp CRLF 其中: CRLF 表示回车换行符(0X0D0A) ; TimeStamp 为发送该消息的机器时间。 为每个请求计算折返时间(RTT) ,统计10 个请求的平均RTT 、最大 /小RTT 。 通过如下命令行启动:java PingClient host port 。 host 为 PingServer 所在的主机地址;port 为 PingServer 的工作端口号 1.学习 ICMP ,了解 ping 命令的工作机理; 2.学习 Java UDP Socket 通信机制; 3.了解 Java 多线程程序设计; 4.服务器 PingServer 程序设计; 5.客户端 PingClient 程序设计。 6.调试与演示 命令工作机制学习 2 小时 UDP Socket 通信机制 2 小时 多线程程序设计 4 小时 程序设计 6 小时 程序设计12 小时 6.调试与演示 4 小时6.课程设计说明书10 小时

使用Socket实现FTP客户端程序

使用Socket 通信实现FTP 客户端程序 FTP 概述 文件传输协议(FTP)作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用。FTP的目标是提高文件的共享性和可靠高效地传送数据。 在传输文件时,FTP 客户端程序先与服务器建立连接,然后向服务器发送命令。服务器收到命令后给予响应,并执行命令。FTP 协议与操作系统无关,任何操作系统上的程序只要符合FTP 协议,就可以相互传输数据。本文主要基于LINUX 平台,对FTP 客户端的实现原理进行详尽的解释并阐述如何使用C 语言编写一个简单的FTP 客户端。 FTP 协议 相比其他协议,如HTTP 协议,FTP 协议要复杂一些。与一般的C/S 应用不同点在于一般的C/S 应用程序一般只会建立一个Socket 连接,这个连接同时处理服务器端和客户端的连接命令和数据传输。而FTP协议中将命令与数据分开传送的方法提高了效率。 FTP 使用2 个端口,一个数据端口和一个命令端口(也叫做控制端口)。这两个端口一般是21 (命令端口)和20 (数据端口)。控制Socket 用来传送命令,数据Socket 是用于传送数据。每一个FTP 命令发送之后,FTP 服务器都会返回一个字符串,其中包括一个响应代码和一些说明信息。其中的返回码主要是用于判断命令是否被成功执行了。 命令端口 一般来说,客户端有一个Socket 用来连接FTP 服务器的相关端口,它负责FTP 命令的发送和接收返回的响应信息。一些操作如“登录”、“改变目录”、“删除文件”,依靠这个连接发送命令就可完成。 数据端口 对于有数据传输的操作,主要是显示目录列表,上传、下载文件,我们需要依靠另一个Socket来完成。 如果使用被动模式,通常服务器端会返回一个端口号。客户端需要用另开一个Socket 来连接这个端口,然后我们可根据操作来发送命令,数据会通过新开的一个端口传输。 如果使用主动模式,通常客户端会发送一个端口号给服务器端,并在这个端口监听。服务器需要连接到客户端开启的这个数据端口,并进行数据的传输。 下面对FTP 的主动模式和被动模式做一个简单的介绍。 主动模式(PORT)

java编写的简单的计算器程序

计算器 项目内容:编写一个Applet,模仿windows附件所带计算器的功能,可以帮助用户完成计算功能,具体如下图所示。 项目要求:使用图形的方式借助窗口、菜单、按钮等标准界面元素和鼠标操作,来帮助用户方便地向计算机系统发出命令,启动操作,并将系统运行的结果同样以图形的方式显示给用户,这样更加直观和生动; 1.Applet容器中组件的添加与设置,包括面板以及菜单的使用; 2.容器中组件的布局管理; 3.Java核心包中数组、数学计算类的使用; 4.异常的处理; 5.事件处理模型中的三类对象的使用: 1.Event-事件,用户对界面操作在java语言上的描述,以类的形式出现,例如键盘操作对应的事件类是KeyEvent。 2.Event Source-事件源,事件发生的场所,通常就是各个组件,例如按钮Button。 3.Event handler-事件处理者,接收事件对象并对其进行处理的对象。 6.程序中事件处理的流程:

1.计算流程的细化 参考代码: import .*;

import .*; import .*; import import import public class Calculator implements ActionListener { #############"); dd(panel); panel1 = new JPanel(); panel2 = new JPanel(); (new BorderLayout()); 键入计算的第一个数字。\n"); ("2. 单击“+”执行加、“-”执行减、“*”执行乘或“/”执行除。\n"); ("3. 键入计算的下一个数字。\n"); ("4. 输入所有剩余的运算符和数字。\n"); ("5. 单击“=”。\n"); aboutCal = new JMenuItem(" 关于计算器(A)"); (this);

基于UDP的文件传输实验报告

实验报告 成 绩 2015年6月 8 日 课程名称 《数据库技术》 学生姓名 *** 学 号 ******** 专业班级 电子信息工程 指导教师

实验名称:基于UDP的文件传输 1.实验目的 (1)熟练掌握Socket编程; (2)分析UDP与TCP的异同。 2.实验设备和条件 硬件环境:PC机 操作系统:Windows 或者Linux 语言环境:Visual C++ ,VS,GCC,Java均可 3.实验要求 参考TCP文件传输demo, 基于UDP实现send.mp3文件的传输,并测试接收到的文件与发送的文件是否一致。 请各位同学于第15周星期三或星期四上课时将纸质版(双面打印)上交! 4.实验内容:测试数据与实验结果(可以抓图粘贴) (1)发送端代码。 #include"stdafx.h" #include #include #define MAX_LENGTH 1024 int_tmain(int argc, _TCHAR* argv[]) { WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 2); if (WSAStartup(wVersionRequested, &wsaData) != 0)//初始化ws2_32.dll动态库 { printf("WSAStartup() failed!\n");//Winsock初始化错误 exit(-1);

} if (wsaData.wVersion != wVersionRequested) { printf("The version of Winsock is not suited!\n");//Winsock版本不匹配WSACleanup();//结束对ws2_32.dll的调用 exit(-2); } //说明ws2_32.dll正确加载 printf("Load ws2_32.dll successfully!\n"); //创建套接字 SOCKET servsock; printf("Create Socket...\n"); servsock = socket(AF_INET, SOCK_DGRAM, 0);//数据报套接字 int servport = 5555; int iSockErr = 0; //定义服务器地址结构 sockaddr_in udpaddr; int len = sizeof(udpaddr); memset(&udpaddr, 0, sizeof(udpaddr)); udpaddr.sin_family = AF_INET; udpaddr.sin_port = htons(servport); //将一个点分十进制IP地址字符串转换成32位数字表示的IP地址udpaddr.sin_addr.s_addr = inet_addr("172.16.4.94");////INADDR_ANY //读取mp3文件 FILE *fp = NULL; errno_t err; err = fopen_s(&fp, "七里香.mp3", "rb"); if (fp == NULL){ printf("Open File Failed!\n"); getchar(); exit(-5); } char buffer[MAX_LENGTH] = "\0";

java中异步socket类的实现和源代码

java中异步socket类的实现和源代码 作者:dozb 我们知道,java中socket类一般操作都是同步进行,常常在read的时候socket就会阻塞直到有数据可读或socket连接断开的时候才返回,虽然可以设置超时返回,但是这样比较低效,需要做一个循环来不停扫描数据是否可读。看来,在同一个线程中,要是想实现异步读写不太容易。 下面介绍的这个类实现了伪异步socket通讯。基本思想就是在现有socket类的基础上进行封装,当sock et连接建立成功后,立即创建一个socket数据接收线程,专门负责阻塞式的socket读取(read),而当前线程负责数据的发送(send)。另外定义了一个接口,包括了socket的各种事件的回调。我们要实现这个接口,在接口实现类中创建异步socket对象,并且传递接口类到异步socket对象中,目的是有socket事件的时候回调我们的方法。 下面是接口: SocketExHandler.java package https://www.360docs.net/doc/8314692298.html,; import https://www.360docs.net/doc/8314692298.html,.*; /** * Title: * Description: * Copyright: Copyright (c) 2001 * Company: https://www.360docs.net/doc/8314692298.html, * @author dozb * @version 1.0 */ /** * 异步Socket Client Interface * 使用方法: * 1.定义类 MySocketClientEx 实现SocketExHandler接口,实现 OnReceive OnClose OnConnect 事件 * 2.在类中实现start方法 MySocketEx = new SocketEx(this,ip,port)

java简单计算器源代码

简单计算器代码 package calcultorthree; import java.awt.BorderLayout;//导入边界布局管理器类 import java.awt.GridLayout;//导入网格布局管理器类 import java.awt.TextField;//导入文本区域类 import java.awt.event.ActionEvent;//导入事件类 import java.awt.event.ActionListener;//导入事件监听者类 import javax.swing.JButton;//导入按钮类 import javax.swing.JFrame;//导入窗体 import javax.swing.JPanel;//导入面板 /** *本例实现了简单计算器代码,具备加减乘除和正弦功能,旨在抱砖引玉。熟悉java的同学,可以在此基础上实现更复杂的功能。 * @author Fjsh */ public class CalcultorThree { //新建对象,在构造函数中进行初始化 JFrame frame;//新建窗体对象 JButton buttonzero,buttondot,buttonequal;//新建按钮“0”“.”“=” JButton buttonplus,buttonminus,buttonmultiple,buttondevision, buttonsin,buttontozero;//新建按钮“+”“-”“*”“/”“sin”和归零按钮JButton buttonone,buttontwo,buttonthree,buttonfour,buttonfive,buttonsix, buttonseven,buttoneight,buttonnine;//新建数字按钮“0”“1”“2”“3”“4”“5”“6”“7”“8”“9” JPanel panelwest,panelcenter,paneleast;//新建三个面板 TextField tf;//新建文本区域对象 public CalcultorThree(){ //初始化对象 tf=new TextField(30);//构造空文本字段,字符宽度为30 frame =new JFrame("CalculatorThree");//构造窗体对象,名称为“CalculatorThree”

客户端程序源代码

#include #include #include #include #include #define rec_length 20 main(int argc, char **argv ) { // structure defined for request as a client struct hostent *hp1; struct sockaddr_in sin1; struct servent *sp1; char sbuf[50]; int ss,spid; char *sservice,*sdest; // structure defined for request as a server struct sockaddr_in sin; struct servent *sp; int s,ns,pid; char buf[50]; char *service; // test the environment parameter: lservice, dservice, server_name if(argc==4){ service=argv[1];sservice=argv[2]; sdest=argv[3];} else { fprintf(stderr,"Parameter assigned Error!\nUsage:\n"); fprintf(stderr,"\t%s lservice dservice server_name!\n",argv[0]); fprintf(stderr,"Note: server_name is defined in file /etc/hosts\n"); fprintf(stderr,"and: lservice dservice are defined in file /etc/services\n"); exit(-1); } if((sp=getservbyname(service,"tcp"))==NULL){ fprintf(stderr,"Error: getservbyname"); exit(-5); } if((s=socket(AF_INET,SOCK_STREAM,0))==-1){ fprintf(stderr,"Error: socket create"); exit(-6); } bzero(&sin,sizeof(sin)); sin.sin_port=sp->s_port; if(bind(s,&sin,sizeof(sin))==-1){ fprintf(stderr,"Error: bind"); close(s); exit(-6); }

基于UDP的文件传输

报告编号:11 综合课程设计报告 基于UDP协议的文件传输系统的设计与实现 学生姓名: 指导教师: 所在系:电子系 所学专业:电子信息工程 年级:08级电子(2)班 2011 年6 月 目录

摘要 (3) 1 实验的相关知识 (4) 1.1通信的模式 (4) 1.2 UDP协议 (4) 1.3 Winsock控件 (4) 1.3.1 Winsock控件重要属性、方法和事件 (5) 1.3.2 Winsock控件通信的工作原理 (7) 2 实验原理 (7) 3 实验步骤 (7) 3.1总体规划 (8) 3.2模块设计 (8) 3.3创建窗体 (8) 3.4程序设计 (10) 3.5系统运行 (11) 4实验结论 (12) 参考文献 (13) 基于UDP的文件传输的系统的设计与实现

摘要 该实验的任务是实现文件的传输,并且是基于UDP协议的。所有文件在该协议下可以实现发送并正确接收。此时需要了解的是UDP的数据包一次最多只能发送8K,所以我们想到通过拆包和创建窗体的方法来实现文件的传输。拆包主要是规定每个数据包的大小,然后计算具体的文件所需要的包数,创建窗体的目的是编写程序来进行分包发送和接收。通过系统运行窗体我们可以知道UDP不仅可以传送和接收小文件,还可以传输和接收较大的文件。通过实验可知UDP是不可靠的无连接传输,所以在传输过程中会发生丢包的情况,但大部分情况下传输还是比较好的。 关键词:UDP协议发送文件接收文件拆包 Winsock控件

1 实验的相关知识 1.1通信的模式 由于是实现点对点的文件传输,因此在程序中我们使用的是C/S的模式来实现通信。对于C/S的模式,即分为客户端和服务端。服务端用来接收客户端的连接,实现两端之间互相传输文件。采用C/S的模式可以更好的体现程序的功能设计思想,充分调用在LAN中的server和client两方面的处理能力,极大的减少网络上的信息流通量。C/S体系结构有可能提供一种开放式的、易伸缩扩展的分布式计算机环境,并保护硬件等投资。 1.2 UDP协议 该实验文件传输是在UDP协议下进行的,UDP提供无连接不可靠的用户数据包传输。其中每一个数据段只有8Byte相对于TCP传输开销较少,且无须对发送速率进行管理。UDP发送数据的速率仅仅受限于程序产生数据的速率,信源主机的性能及internet上可以利用的宽带。并且与TCP不同的是UDP不需要连接,可直接发送,传输数据较快,但同时其稳定性不好,易丢包。 1.3 Winsock控件 Winsock即Windows Sockets规范的简称,是目前最流行的网络通信应用程序接口之一。所谓Socket,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。Winsock控件工作在传输层上,在这一层上,目前主要流行的协议包括TCP和UDP两种:TCP协议适用于那些对于数据的可靠性要求比较高的情况,目前大多数的网络应用层协议都是基于TCP协议的(例如常用的HTTP、FTP、SMTP、POP3等协议);UDP 协议适用于对数据可靠性要求不高而对速度要求较高的情况,这里主要包括一些需要大流量

在Linux下基于TCP协议的文件传输程序

Linux下基于TCP/IP协议的文件传输程序 【设计目的】 通过Linux C编程,设计一个基于TCP/IP的文件传输系统,实现网络文件的收发 【设计环境】 Ubuntu 12.04 【设计方案】 (1)文件读写 任意文件都可以二进制的方式进行读写,为了实现任意文件类型的传输,在读写文件的过程中,必须采用二进制的读写方式。 (2)传输协议 为了保证数据的正确性,文件传输需要采用一种可靠的传输协议。UDP协议实现比较简单,但UDP面向无连接,传输过程中,会出现丢包的情况,导致数据发送失败。故采用面向连接的TCP/IP协议,防止传输过程中的数据丢失的情况。 (3)大文件的传输 对于比较大的文件,应该进行分包操作,以防止占用过多的内存,导致文件发送失败。【设计流程】 如图1所示,服务器程序作为文件的发送方。首先,服务器端输入要发送的文件。然后,创建一个流式套接字(SOCK_STREAM),进行绑定。绑定成功后,执行监听,当有客户发送连接请求,执行Accept(),接收来自客户端的请求。 连接建立后,首先服务器向客服端发送的文件的文件名及扩展名等信息。信息发送完毕,服务器方将待发送的数据读入缓冲区,通过套接字将数据发送出去。发送完成后退出,并显示发送完成的信息。

图1 服务器流程图 如图2所示,客户端程序完成文件的接收操作。首先,创建一个流式套接字。套接字创建成功后,对该套接字进行绑定。绑定成功后,向服务器方发送连接请求。连接成功后,首先,接收服务器发送的文件信息。接收成功后,开始数据的接收。文件接收完毕,显示文件已接收完成。

图2 客户端流程图 【设计测试】 了验证设计的正确性,在Ubuntu 12.04系统上对可执行文件进行了回环测试。步骤如下: (1)测试文件a.txt及服务器端文件源fileserver.c和可执行文件fileserver

单片机简易计算器设计

单片机简易计算器设计 Company Document number:WTUT-WT88Y-W8BBGB-BWYTT-19998

一、设计要求 1.设计4*4的键盘,其中10个数字键0~9,其余6个为“+”“-”“*”“/”“=”和“C” 2.设计2位LED接口电路 3.实现1位数的简单运算 二、硬件系统设计 1、LED接口电路 简易计算器需要2位8段码LED显示电路。用8031单片机经8255A扩展2位8段码LED显示器,用8255A的A口作为段码(字形代码)数据口,PB0和PB1作为位控制端口。在位控制口加集电极开路的反相高压驱动器74LS06以提供驱动LED显示器所需的足够大的电流,然后接至各数码显示器的共阴极端。同理,在段码数据口集电极开路的正相高压驱动器74LS07提供足够大的电流,然后接到数码显示器的各段。逻辑电路结构如下:

2、键盘接口电路 简易计算器需要4*4的行列式键盘。用8031单片机经8255A扩展4*4行列式键盘,8255A的B口和C口用于扩展键盘接口,B口高4位作为输出口,C口低4位作为输入口。逻辑电路结构如下: 3、计算器逻辑电路图 将LED接口电路和键盘接口电路结合到一起就是简易计算器的逻辑电路图,如下: 三、软件设计 1、LED显示程序设计 LED显示器由七段发光二极管组成,排列成8字形状,因此也成为七段LED显示器,器排列形状如下图所示:

为了显示数字或符号,要为LED显示器提供代码,即字形代码。七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。简易计算器用到的数字0~9的共阴极字形代码如下表: 0~9七段数码管共阴级字形代码 2位LED显示的程序框图如下: 2、读键输入程序设计 为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码——键码。为了得到被按键的键码,现使用行扫描法识别按键。其程序框图如下: 3、主程序设计 (1)数值送显示缓冲程序设计 简易计算器所显示的数值最大位两位。要显示数值,先判断数值正负,如果是负值,则符号位显示“-”,然后将数值除以10,余数送显最最低位,判断商是否为0,若为0则返回,若不为0,则将商除以10,将余数送显高位。程序框图如下: (2)运算主程序设计

UDP文件传输

1.实验目的 了解udp文件传输过程,掌握传输方法。 2.实验内容 要实现无差错的传输数据,我们可以采用重发请求(ARQ)协议,它又可分为连续ARQ 协议、 选择重发ARQ 协议、滑动窗口协议。本文重点介绍滑动窗口协议,其它的两种有兴趣的可参考相关 的网络通信之类的书。 采用滑动窗口协议,限制已发送出去但未被确认的数据帧的数目。循环重复使用已收到的那些数 据帧的序号。具体实现是在发送端和接收端分别设定发送窗口和接收窗口。 3.实验总结 学会了udp协议传输和代码设计,了解了udp的格式。 发送端的发送线程: int ret; int nPacketCount = 0; DWORD dwRet;

SendBuf sendbuf; DWORD dwRead; DWORD dwReadSize; SendBuf* pushbuf; //计算一共要读的文件次数,若文件已读完,但客户端没有接收完, //则要发送的内容不再从文件里读取,而从m_bufqueue 里提取 nPacketCount = m_dwFileSize / sizeof(sendbuf.buf); //若不能整除,则应加1 if(m_dwFileSize % sizeof(sendbuf.buf) != 0) ++nPacketCount; SetEvent(m_hEvent); CHtime htime; //若已发送大小小于文件大小并且发送窗口前沿等于后沿,则继续发送 //否则退出循环 if(m_dwSend < m_dwFileSize) // 文件没有传输完时才继续传输 { while(1) { dwRet = WaitForSingleObject(m_hEvent, 1000); if(dwRet == WAIT_FAILED) { return false; } else if(dwRet == WAIT_TIMEOUT) { //重发 ::EnterCriticalSection(&m_csQueue); // 进入m_bufqueue 的排斥区 ret = m_hsocket.hsendto((char*)m_bufqueue.front(), sizeof(sendbuf)); ::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue 的排斥区 if(ret == SOCKET_ERROR) { cout << "重发失败,继续重发" << endl; continue; } ResetEvent(m_hEvent); continue; } //若发送窗口大小< 预定大小&& 已读文件次数(nReadIndex) < 需要读文件的次数(nReadCoun t),则继续读取发送 //否则,要发送的内容从m_bufqueue 里提取 if(m_dwSend < m_dwFileSize) { dwReadSize = m_dwFileSize - m_dwSend; dwReadSize = dwReadSize < MAXBUF_SIZE ? dwReadSize : MAXBUF_SIZE;

文件传输程序设计讲解

Internet网络程序设计实验报告基于Socket的文件传输程序设计 姓名:莫敌 班级:软件 0904 学号:U200917895 指导老师:陆永忠 2012.03.31

目录 1 实验目的及要求 (3) 1.1 实验目的 (3) 1.2 实验要求 (3) 2 实验环境 (3) 3 实验程序设计 (3) 3.1 设计思想 (3) 3.2 程序设计流程框图 (4) 3.3 详细设计 (5) 3.3.1 界面设计 (5) 3.3.2 主要功能实现 (6) 3.4 运行结果 (9) 4 实验感想 (11)

1实验目的及要求 1.1实验目的 熟悉Socket的通讯机制,了解网络程序的设计方法。重点掌握基于TCP协议的Socket 网络编程。 1.2实验要求 设计界面,在服务器端和客户端传输图片和文件。如果是图片请显示该图片,如果是其他文件,则保存。 2实验环境 编译环境:Windows 7 + Visual Studio 2010 使用MFC编写。 运行环境:Windows 7操作系统。 3实验程序设计 3.1设计思想 根据实验的要求:在服务器和客户端之间传输文件和图片,则需要程序提供一种可靠的网络传输服务来保证文件在传输过程中无丢失、损坏。在分析了传输层协议TCP协议和UDP 协议后,了解到TCP协议提供的是一种面向连接的、可靠的字节流服务,而UDP协议提供的是一种无连接的、不可靠的数据报服务。由于程序的需求,即必须保证文件传输的可靠性,于是,我采用基于TCP协议的Windows sockets来设计实现本实验。

3.2程序设计流程框图 图1程序设计流程框图

java编写简单计算器源代码

import javax.swing.*; import java.awt.event.*; import java.awt.*; import https://www.360docs.net/doc/8314692298.html,ng.Math; class ring extends JFrame implements ActionListener { //定义成员变量: //JFrame frame;//定义一个窗口类; JTextField text;//定义一个文本框类; JLabel label;//定义一个标签类; JPanel p1,p2,p3,p4,p5,p6;//定义面板类; String s1,s,s2;//定义三个字符串变量; int count=0; JButton a1,a2,a3,a4,a5,a6,b1,b2,b3,b4,b5,b6,c1,c2,c3,c4,c5,c6,d1,d2,d3,d4 ,d5,d6; //ring的构造函数; ring() { this.setTitle("计算器"); // super("计算器"); JMenuBar menubar1=new JMenuBar();//新建菜单条; this.setJMenuBar(menubar1); JMenu menu1=new JMenu("编辑(E)"); JMenu menu2=new JMenu("查看(V)"); JMenu menu3=new JMenu("帮助(H)"); menubar1.add(menu1); menubar1.add(menu2); menubar1.add(menu3); JMenuItem item1=new JMenuItem("复制(c) ctrl+c"); JMenuItem item2=new JMenuItem("粘贴(p) ctrl+v"); JMenuItem item3=new JMenuItem("标准型(T)"); JMenuItem item4=new JMenuItem("科学型(s)"); JMenuItem item5=new JMenuItem("数字分组(I)"); JMenuItem item6=new JMenuItem("帮助主题(H)"); JMenuItem item7=new JMenuItem("关于计算机(A)"); menu1.add(item1); menu1.add(item2); menu2.add(item3); menu2.add(item4); menu2.add(item5); menu3.add(item6);

数字万年历简易C语言程序源代码

#include"reg52.h" #define uchar unsigned char #define uint unsigned int sbit rs=P2^0; // lcd 控制端 sbit en=P2^2; // lcd 控制端 sbit all=P2^1; // lcd 控制端 sbit s0=P1^5; //时间调节 sbit s1=P1^6; sbit s2=P1^7; sbit voice=P2^7; int nt; sbit DQ=P2^6; sbit DS1302_CLK = P2^3; //实时时钟时钟线引脚sbit DS1302_IO = P2^4; //实时时钟数据线引脚sbit DS1302_RST = P2^5; //实时时钟复位线引脚sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; unsigned char time; #define ads_y 0 #define ads_mo 3 #define ads_d 6 #define ads_w 9 #define ads_h 65 #define ads_m 68 #define ads_s 71 #define DS1302_SECOND 0x80 //写入ds地址宏定义 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_WEEK 0x8A #define DS1302_DAY0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C

相关文档
最新文档