VC 实现文件关联

VC 实现文件关联
VC 实现文件关联

VC/MFC 设置程序与文件关联与双击文件获取文件路径(2008-10-10 10:59:15)

分类:编程技术标签:vc/mfc设置程序与文件关联双击

文件获取文件路径it

如何设置程序与文件关联并且双击关联文件时获取文件的路径呢?

一般来说可以通过写注册表的方式实现,在函数入口处实现功能。

例如在VC/MFC中,可以在应用程序的C**App.cpp文件中InitInstance()函数中实现该功能。#include

using namespace std;

//关联文件的后缀名,如"txt"、"doc"等

string m_csExtension;

string m_csShellOpenCommand;

string m_csDocumentShellOpenCommand;

//注册表中文件夹类名

string m_csDocumentClassName;

//关联文件的默认图标

string m_csDocumentDefaultIcon;

///////赋值函数//////

void SetExtension( LPCTSTR szExtension )

{

m_csExtension = szExtension;

}

void SetShellOpenCommand( LPCTSTR szShellOpenCommand )

{

m_csShellOpenCommand = szShellOpenCommand;

}

void SetDocumentShellOpenCommand( LPCTSTR szDocumentShellOpenCommand )

{

m_csDocumentShellOpenCommand = szDocumentShellOpenCommand;

}

void SetDocumentClassName( LPCTSTR szDocumentClassName )

{

m_csDocumentClassName = szDocumentClassName;

}

void SetDocumentDefaultIcon( LPCTSTR szDocumentDefaultIcon )

{

m_csDocumentDefaultIcon = szDocumentDefaultIcon;

}

///////赋值函数//////

//////关键函数:实现写注册表的函数////////

BOOL SetRegistryValue(

HKEY hOpenKey,

LPCTSTR szKey,

LPCTSTR szValue,

LPCTSTR szData

){

// validate input

if( !hOpenKey || !szKey || !szKey[0] ||

!szValue || !szData ){

::SetLastError(E_INVALIDARG);

return FALSE;

}

BOOL bRetVal = FALSE;

DWORD dwDisposition;

DWORD dwReserved = 0;

HKEY hTempKey = (HKEY)0;

// length specifier is in bytes, and some TCHAR

// are more than 1 byte each

DWORD dwBufferLength = lstrlen(szData) * sizeof(TCHAR);

// Open key of interest

// Assume all access is okay and that all keys will be stored to file

// Utilize the default security attributes

if( ERROR_SUCCESS == ::RegCreateKeyEx(hOpenKey, szKey, dwReserved, (LPTSTR)0, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, 0,

&hTempKey, &dwDisposition) ){

// dwBufferLength must include size of terminating nul

// character when using REG_SZ with RegSetValueEx function

dwBufferLength += sizeof(TCHAR);

if( ERROR_SUCCESS == ::RegSetValueEx(hTempKey, (LPTSTR)szValue, dwReserved, REG_SZ, (LPBYTE)szData, dwBufferLength) ){

bRetVal = TRUE;

}

}

// close opened key

if( hTempKey ){

::RegCloseKey(hTempKey);

}

return bRetVal;

}

BOOL RegSetExtension(void)

{

if( m_csExtension.empty() )

{

return FALSE;

}

std::string csKey = "." + m_csExtension;

SetRegistryValue(HKEY_CLASSES_ROOT, csKey.c_str(), "", m_csDocumentClassName.c_str());

if( !m_csShellOpenCommand.empty() )

{

csKey += "\\shell\\open\\command";

SetRegistryValue(HKEY_CLASSES_ROOT, csKey.c_str(), "", m_csShellOpenCommand.c_str());

}

return TRUE;

}

BOOL RegSetDocumentType(void)

{

if( m_csDocumentClassName.empty())

{

return FALSE;

}

std::string csKey = m_csDocumentClassName;

SetRegistryValue(HKEY_CLASSES_ROOT, csKey.c_str(), "", m_csDocumentDescription.c_str());

// DefaultIcon

if( !m_csDocumentDefaultIcon.empty() )

{

csKey = m_csDocumentClassName;

csKey += "\\DefaultIcon";

SetRegistryValue(HKEY_CLASSES_ROOT, csKey.c_str(), "", m_csDocumentDefaultIcon.c_str());

}

// shell\open\command

if( !m_csShellOpenCommand.empty() )

{

csKey = m_csDocumentClassName;

csKey += "\\shell\\open\\command";

SetRegistryValue(HKEY_CLASSES_ROOT, csKey.c_str(), "",

m_csShellOpenCommand.c_str());

}

return TRUE;

}

BOOL RegSetAllInfo(void)

{

RegSetExtension(); RegSetDocumentType();

return TRUE;

}

//注册程序与文件后缀名的关联

void RegisterFileAndProgram()

{

////一个应用程序与多个文件后缀关联//// #define strExternsionLength 4

LPCTSTR strExtension[] =

{

"bmp",

"jpg",

"jpe",

"jpeg"

};

CGCFileTypeAccess TheFTA;

TCHAR szProgPath[MAX_PATH * 2];

//获取程序路径

::GetModuleFileName(NULL, szProgPath, sizeof(szProgPath)/sizeof(TCHAR)); CString csTempText;

for(int i = 0; i < strExternsionLength; ++i)

{

//设置程序需要关联的后缀名,如"txt" "doc" 等

SetExtension(strExtension[i]);

csTempText.Format("\"%s\" %s",szProgPath,"\"%1\"");

SetShellOpenCommand(csTempText);

SetDocumentShellOpenCommand(csTempText);

//设置注册表中文件类的别名,例如可以是程序名称:**.exe

SetDocumentClassName("**");

// use first icon in program

csTempText = szProgPath;

csTempText += ",0";

SetDocumentDefaultIcon(csTempText);

RegSetAllInfo();

}

}

//入口函数:初始化所需的操作

BOOL C**App::InitInstance()

{

//////////

//***Code***

////////

//注册程序与文件后缀名的关联

RegisterFileAndProgram();

// 分析标准外壳命令、DDE、打开文件操作的命令行

CCommandLineInfo cmdInfo;

ParseCommandLine(cmdInfo);

//获取命令行传过来的参数:双击打开的文件的文件路径名称

CString strFilePathName = cmdInfo.m_strFileName;

// 调度在命令行中指定的命令。如果

// 用/RegServer、/Register、/Unregserver 或/Unregister 启动应用程序,则返回FALSE。

if (!ProcessShellCommand(cmdInfo))

return FALSE;

//////////

//通过获取的strFilePathName文件名称实现相关操作//

//Add code here//

////////

return TRUE;

}

VC 实现文件关联

2009-08-03 16:54

文件关联的两个简单函数

//---------------------------------------------------------------------------

// 检测文件关联情况

// strExt: 要检测的扩展名(例如: ".txt")

// strAppKey: ExeName扩展名在注册表中的键值(例如: "txtfile")

// 返回TRUE: 表示已关联,FALSE: 表示未关联

BOOL CheckFileRelation(const char *strExt, const char *strAppKey) {

int nRet=FALSE;

HKEY hExtKey;

char szPath[_MAX_PATH];

DWORD dwSize=sizeof(szPath);

if(RegOpenKey(HKEY_CLASSES_ROOT,strExt,&hExtKey)==ERROR_SUCCESS) {

RegQueryValueEx(hExtKey,NULL,NULL,NULL,(LPBYTE)szPath,&dwSize );

if(_stricmp(szPath,strAppKey)==0)

{

nRet=TRUE;

}

RegCloseKey(hExtKey);

return nRet;

}

return nRet;

}

//---------------------------------------------------------------------------

// 注册文件关联

// strExe: 要检测的扩展名(例如: ".txt")

// strAppName: 要关联的应用程序名(例如: "C:\MyApp\MyApp.exe")

// strAppKey: ExeName扩展名在注册表中的键值(例如: "txtfile")

// strDefaultIcon: 扩展名为strAppName的图标文件(例如:

"C:\MyApp\MyApp.exe,0")

// strDescribe: 文件类型描述

void RegisterFileRelation(char *strExt, char *strAppName, char

*strAppKey, char *strDefaultIcon, char *strDescribe)

{

char strTemp[_MAX_PATH];

HKEY hKey;

RegCreateKey(HKEY_CLASSES_ROOT,strExt,&hKey);

RegSetValue(hKey,"",REG_SZ,strAppKey,strlen(strAppKey)+1);

RegCloseKey(hKey);

RegCreateKey(HKEY_CLASSES_ROOT,strAppKey,&hKey);

RegSetValue(hKey,"",REG_SZ,strDescribe,strlen(strDescribe)+1); RegCloseKey(hKey);

sprintf(strTemp,"%s\\DefaultIcon",strAppKey);

RegCreateKey(HKEY_CLASSES_ROOT,strTemp,&hKey);

RegSetValue(hKey,"",REG_SZ,strDefaultIcon,strlen(strDefaultIcon)+ 1);

RegCloseKey(hKey);

sprintf(strTemp,"%s\\Shell",strAppKey);

RegCreateKey(HKEY_CLASSES_ROOT,strTemp,&hKey);

RegSetValue(hKey,"",REG_SZ,"Open",strlen("Open")+1);

RegCloseKey(hKey);

sprintf(strTemp,"%s\\Shell\\Open\\Command",strAppKey);

RegCreateKey(HKEY_CLASSES_ROOT,strTemp,&hKey);

sprintf(strTemp,"%s \"%%1\"",strAppName);

RegSetValue(hKey,"",REG_SZ,strTemp,strlen(strTemp)+1); RegCloseKey(hKey);

}

MODBUS-TCP 协议

MODBUS-TCP 协议 一 以太网的标准 以太网是一种局域网。早期标准为IEEE 802.3,数据链路层使用CSMA/CD,10Mb/s 速度物理层有: (1)10 Base 5粗同轴电缆,RG-8,一段最长为500m; (2)10 Base 2细同轴电缆,RG-58,一段最长为185m; (3)10 Base T双绞线,UTP或STP,一段最长为100m。 快速以太网为100Mb/s,标准为802.3a,介质为100 Base Tx双绞线、100 Base Fx光纤。 目前10/100M以太网使用最为普遍,很多企事业用户已实现100M到以太网桌面,确实体验到高速“冲浪”的快感,另外从距离而言,非屏蔽双绞线(UTP)为100m,多模光纤可达2~3km,单模光纤可大于100km。千兆以太网1000Mb/s为802.3z/802.3ab,万兆以太网10Gb/s 为802.3ae,将为新一轮以太网的发展带来新的机遇与冲击。 二 工业以太网与商用以太网的区别 什么是工业以太网?技术上,它与IEEE802.3兼容,故从逻辑上可把商用网和工业网看成是一个以太网,而用户可根据现场情况,灵活装配自己的网络部件,但从工业环境的恶劣和抗干扰的要求,设计者希望采用市场上可找到的以太网芯片和媒介,兼顾考虑下述工业现场的特殊要求:首先要考虑高温、潮湿、振动;二是对工业抗电磁干扰和抗辐射有一定要求,如满足EN50081-2、EN50082-2标准,而办公室级别的产品未经这些工业标准测试,表1列出了一些常用工业标准。为改善抗干扰性和降低辐射,工业以太网产品多使用多层线路板或双面电路板,且外壳采用金属如铸铝屏蔽干扰;三是电源要求,因集线器、交换机、收发器多为有源部件,而现场电源的品质又较差,故常采用双路直流电或交流电为其供电,另外考虑方便安装,工业以太网产品多数使用DIN导轨或面板安装;四是通信介质选择,在办公室环境下多数配线使用UTP,而在工业环境下推荐用户使用STP(带屏蔽双绞线)和光纤。 三 TCP/IP 1. 为什么使用TCP/IP? 最主要的一个原因在于它能使用在多种物理网络技术上,包括局域网和广域网技术。TCP/IP协议的成功很大程度上取决于它能适应几乎所有底层通信技术。 20世纪80年代初,先在X.25上运行TCP/IP协议;而后又在一个拨号语音网络(如电话系统)上使用TCP/IP协议,又有TCP/IP在令牌环网上运行成功;最后又实现了TCP/IP远程

TCP协议网络编程实现两台计算机通信(详细注释)

3.试用C语言编写一对在以太网中发送和接收数据帧的应用,建议采用Socket 的TCP协议端口,必须提供软件设计方案和流程图,软件代码的每一行都必须加注中文注释说明设计意图,不得抄袭。(必做题) 解答: 编程使用TCP/IP协议,采用数据流的socket套接口,TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于点对点的通讯。对比一下,UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送,UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出丢包现象。 程序采用服务器/客户机模式,下面是服务器的程序设计方案 【1】首先利用socket系统调用获得一个套接口 【2】系统调用bind将这个套接口绑定到主机的某个端口上 【3】端口开始侦听有无连接请求,系统调用listen 【4】没有就继续侦听,有的话执行下一步 【5】接受connect的请求,系统调用accept(),得到一个新的套接口描述符,这个时候通信管道已经完全建立好了 【6】利用这个新的描述符完成发送数据帧的操作,系统调用send() 【7】发送完毕要撤销套接口 下面是完整程序和详细注释 清单01 server.c #include #include #include #include #include #include #include #include /头文件 #define MYPORT 3490 /定义用于通信的端口号 #define BACKLOG 10 /定义等待队列中最多存放的connect请求个数main() /主函数这里开始 {int sockfd,new_fd; /这两个是调用socket()系统调用得到的文件描述符struct sockaddr_in my_addr; /结构体定义,这是自己和对方的套接口的地址信息struct sockaddr_in their_addr; int sin_size; /其实这是accept()里面的第三个参数,这里先定义if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) {perror("socket"); /进入正题,首先socket()系统调用,sockfd就是exit(1); /所得套接口的文件描述符,如果调用失败,perror会} /显示错误信息,然后非正常退出 my_addr.sin_family=AF_INET; / ADDRESS FAMILY 地址族 my_addr.sin_port=htons(MYPORT);/ 把整数MYPORT转换成“网络字节顺序”my_addr.sin_addr.s_addr=INADDR_ANY;/ 使用自己的IP地址, 自动填上它所运 行的机器的 IP 地址

编程实现简单的TCP协议分析器

《网络系统》课程设计报告 学院专业 班级学号 学生姓名指导教师 课程成绩完成日期2013年6月28日

课程设计成绩评定 学院专业 班级学号 学生姓名指导教师 完成日期2013年6月28日 指导教师对学生在课程设计中的评价 评分项目优良中及格不及格课程设计中的创造性成果 学生掌握课程内容的程度 课程设计完成情况 课程设计动手能力 文字表达 学习态度 规范要求 课程设计论文的质量 指导教师对课程设计的评定意见 综合成绩指导教师签字2013年6月28日

课程设计任务书 学院专业 课程名称网络系统课程设计时间2012~2013学年第二学期17~18周学生姓名指导老师 题目编程实现简单的TCP协议分析器 主要内容: (1)从局域网中抓取IP数据包; (2)对它进行分析得到相应的头部信息; (3)过滤TCP包进行分析,得到TCP包的相应信息 (4)谈谈本次课程设计活动的体会和心得 要求: (1)利用编程软件 (2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作精神。 (3)学会文献检索的基本方法和综合运用文献的能力。 (4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。 应当提交的文件: (1)课程设计报告。 (2)课程设计附件(源程序、各类图纸、实验数据、运行截图等)

编程实现简单的TCP协议分析器 学生姓名:指导老师: 摘要编程实现简单的TCP协议分析器。TCP协议分析器是一种用于监督和跟踪网络活动的诊断工具。它从局域网中抓取IP数据包,并对它进行分析得到相对应的头部信息,过滤TCP包进行分析,得到TCP包的相应信息。运行程序平台为windows7/XP,程序通过调试运行,初步实现了设计目标,并且再经过适当完善后,将可以应用在商业中解决实际问题。TCP协议的数据传送程序是由二个子程序组成的。也可以看成是服务器端程序和客户端程序,其中:服务器端程序的功能是侦听端口号,接收远程主要的TCP连接申请,并接收远程主机传送来的文字数据。 关键词程序设计;TCP;局域网;指令;服务器

基于TCP协议的简单即时通信软件的设计与实现

基于TCP协议的网络通信系统的设计与实现 摘要:网络通信,由于其具有实时性、跨平台性、成本低、效率高等优点而受到广泛的使用。设计并实现一个能够处理多用户进行实时、安全的即时通信系统具有较强的现实意义。即时通信的底层通信是通过SOCKET套接字接口实现的。当前的主流UNIX系统和微软的WINDOWS系统都在内核提供了对SOCKET字接口的支持。使用这个统一的接口,可以编写一个可移植的TCP/IP通信程序。使信息能够在INTERNET上可靠的传输。 本文设计并实现了基于局域网内的简单即时通信系统,系统采用C/S模式,底层通信通过SOCKET套接字接口实现,服务器负责客户端的登录验证,好友信息的保存和心跳报文的发送。客户端采用P2P方式实现消息传递,并能实现文件的传输。本文首先讨论了同步套接字,异步套接字,多线程并发执行任务等;然后阐述了客户端、服务器如何使用XML序列化的消息进行通信。 关键词:即时通信;文件传输;套接字;TCP协议 Abstract :Instant messages have several advantages such as real-time, cross-platform, cheap and efficient. To design a Multi-user IM (instant message) architecture is very i mportant in both theory and realism. Instant message based on TCP/IP protocol that is realized by socket interface. Almost all UNIX operation systems and Microsoft's win dows operation systems provide support of socket in the kernel. Using the uniform int erface, we can develop a portable program of TCP/IP, which help us transfer informati on in Internet safely and credibly. The system uses the client/server(C/S) mode. The server takes the responsibility of th e login message of client, the saving of friend message and Message heartbeat. The tra nsmission of the basic messages of the customer end will be designed on P2P architec ture. This thesis explains how the client and server communicate via serializing XML message. Key words: Instant Message; File Transfer; Socket; TCP protocol

基于tcp协议通信系统的设计与实现

基于TCP协议通信系统的设计与实现 杨秀森 (贵州师范大学机电学院电气工程及其自动化学号:0914********) 摘要:通信协议(communications protocol)是指双方实体完成通信或服务所必须遵循的规则和约定。协议定义了数据单元使用的格式,信息单元应该包含的信息与含义,连接方式,信息发送和接收的时序,从而确保网络中数据顺利地传送到确定的地方。通信的底层通信是通过SOCKET套接字接口实现的。当前的主流UNIX系统和微软的WINDOWS系统都在内核提供了对SOCKET字接口的支持。使用这个统一的接口,可以编写一个可移植的TCP通信程序。 本文设计并实现了基于局域网内的简单即时通信系统,系统采用C/S模式,底层通信通过SOCKET套接字接口实现,服务器负责客户端的登录验证,好友信息的保存和心跳报文的发送。客户端采用P2P方式实现消息传递,并能实现文件的传输。本文首先讨论了同步套接字,异步套接字,多线程并发执行任务等;然后阐述了客户端、服务器如何使用XML序列化的消息进行通信。 关键词:TCP协议;通信协议系统;套接字;文件传输;C/S模式; The System Design and Implementation of Based on TCP Protocol Communication Yang Xiu Sen (Guizhou Normal University Institute of mechanical and electrical engineering and its automation number: 0914********) Abstract: Communication protocol ( communications protocol ) refers to both entities to complete communication or service must follow the rules and conventions. The protocol defines a data unit format, information unit should contain information and meaning, connection mode, information transmission and reception timing, thereby ensuring that the network data smoothly transmitted to determine places. Communication communication is through the SOCKET socket interface implementation. The current mainstream UNIX system and Microsoft WINDOWS system in the kernel provides to SOCKET interface support. Using the unified interface, can be prepared in a transplantable TCP communication program. This paper designed and implemented based on a simple LAN instant communication system, the system adopts C/S model, the underlying communication through the SOCKET socket interface

stm32,tcp协议实现

竭诚为您提供优质文档/双击可除 stm32,tcp协议实现 篇一:基于stm32的串口服务器web功能实现 基于stm32 web功能实现 编制:陈志磊校对:审核: 日期:20xx-12-30 版本:V1.0 的串口服务器 说明: 本文主要说明通过web访问来配置串口服务器参数的功能,前提要求lwip和ucosii都已移植成功。实现b/s结构,须将串口服务器配置为webserver。 一.webserver文件以及相关技术简介 1.相关文件说明 st公司的官网上提供了通过lwip完成webserver配置 的例程,打开我们的工程文件夹“lwip1.4.1移植stm32V1.8”,在lwip-app/web_server_demo文件夹下的文件如图所示:各个文件的说明见下表:

2.网页制作及网页数组数据转换 (1)网页制作 使用dreamweaver进行网页制作,交互方式主要是通过表单来完成,注意对于使用了需要使用ssi技术来嵌入数据的,需要将网页后缀设为shtml、shtm、stm等。st的例程默认使用首页索引在httpd.c中g_psdefaultFilenames[] 数组里表示,该数组如下: constdefault_filenameg_psdefaultFilenames[]={{"/ind ex.shtml",false},{"/index.ssi",true},{"/index.shtm" ,true},{"/index.html",false},{"/index.htm",false}}; 该数据表示支持首页索引为index.shtml、index.html、index.htm的网页文件输入。在网 页设计时,需考虑以下两个方面: a.表单的操作设计,表单提交的方法为post,表单的处理设为对应的cgi。 b.ssi标签的嵌入。在需要嵌入信息的位置插入ssi标签。关于cgi和ssi稍后将会简要说明。 (2)网页数组数据转换 在makefsdata文件夹下的fs文件为网页源文件,如下图: 由于网页源文件不能直接放到stm32里面,所以要做一个转换,这里通过makefsdata.exe这个工具将原始网页文件转换成.c格式的网页数组,这样就可以添加到工程中了,

PC机与PLC的串行通信通过Modbus TCP协议实现

PC机与PLC的串行通信通过Modbus TCP协议实现 1 引言 智能楼宇工程中的中央空调、电梯、通风、给排水、照明、火灾报警等个子系统的互联方案中,采用Modbus TCP协议的串行通信方式,全面兼容modbus工业标准,数据传输可靠,响应速度快,扩展灵活,通过互联网实现各子系统与中央管理系统的通信。modbus tcp协议是在tcp/ip标准中,应用层采用工业领域事实标准modbus。modbus使用tcp/ip 应用层的502端口,这是经过国际公认的。该串行总线方式支持各种介质的rs-232、rs-422、rs-485接口。modbus tcp的网络通信模式采用client/server方式,如图1所示。 图1 modbus tcp的网络通信模式 2 modbus tcp串行通信分析与实现 某智能楼宇中各子系统主要采用PLC作为主控模块,如图2所示。网络互联采用modbus tcp网络通信模式,中央管理系统与该网络的互联是亟待解决的问题,plc将智能楼宇中各子系统的相关状态和参数信息保存于它的寄存器中,中央管理系统需要读取plc中一些保持寄存器的数值,以此来进行智能楼宇的全面监控与管理。modbus tcp协议提供了相应指令来进行保持寄存器的读取。 图2 智能楼宇系统示意图 2.1 协议分析 modbus tcp数据报文结构,如图3所示。 图3 modbus tcp数据报文结构

一次modbus tcp读取保持寄存器的通信分析(省略了ip/tcp头): 从左向右分析该数据报文:00 03为此次通信编号,一般每次通信之后将被要求加1以区别不同的通信数据报文;00 00表示协议标识符,00 00为modbus协议;00 06为数据长度,用来指示接下来数据的长度,单位字节;03为设备地址,用以标识连接在串行线或者网络上的远程服务端的地址。以上七个字节也被称为modbus报文头。03为功能码,此时代码03为读取保持寄存器数据。00 00 00 01为功能码的参数,指示将被读取的保持寄存器的地址与长度。从左向右分析该数据报文:00 03为此次通信编号,应答报文要求与先前对应的请求保持一致;00 00为协议标识符,00 00表示modbus协议;00 05为数据长度,用来指示接下来数据的长度,单位字节;03为设备地址,应答报文要求与先前对应的请求保持一致。以上七个字节同样为modbus报文头。03为功能码,正常情况下应答报文要求与先前对应的请求保持一致,如果出错则返回80h+先前的功能码。02为功能码的第一个参数,指示接下来数据的字节长度;00 17为被读取的保持寄存器中的数据值,即要求被读取的地址为00 00的保持寄存器中的数值为0017h。 测试程序(master)发送数据(hex)及plc(modbus tcp slave) 响应数据(hex)样例分析如 图4所示。 图4 程序发送/接收数据包样例分析 2.2 程序流程 以下是主程序的流程图,如图5所示,主要功能是建立tcp/ip连接以及连接错误处理。modbus tcp协议的每一次工作循环的流程图,如图6所示。

TCP协议详解

TCP协议详解 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样。计算机使用者意识到,计算机只是单兵作战并不会发挥太大的作用。只有把它们联合起来,电脑才会发挥出它最大的潜力。于是人们就想方设法的用电线把电脑连接到了一起。 但是简单的连到一起是远远不够的,就好像语言不同的两个人互相见了面,完全不能交流信息。因而他们需要定义一些共通的东西来进行交流,TCP/IP就是为此而生。TCP/IP不是一个协议,而是一个协议族的统称。里面包括了IP协议,IMCP协议,TCP协议,以及我们更加熟悉的http、ftp、pop3协议等等。电脑有了这些,就好像学会了外语一样,就可以和其他的计算机终端做自由的交流了。 TCP/IP协议分层 ![TCP分层 2.jpg](http://upload-images.jianshu.io/upload_images/2964446-94da7e7442050d15.jpg?i mageMogr2/auto-orient/strip%7CimageView2/2/w/1240) TCP/IP协议族按照层次由上到下,层层包装。 应用层: 向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。远程登录TELNET使用TELNET协议提供在网络其它主机上注册的接口。

TELNET会话提供了基于字符的虚拟终端。文件传输访问FTP使用FTP协议来提供网络内机器间的文件拷贝功能。 传输层: 提供应用程序间的通信。其功能包括:一、格式化信息流;二、提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。 网络层: 负责相邻计算机之间的通信。其功能包括三方面。 一、处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。 二、处理输入数据报:首先检查其合法性,然后进行寻径--假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。 三、处理路径、流控、拥塞等问题。 网络接口层: 这是TCP/IP软件的最低层,负责接收IP数据报并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层。 IP 是无连接的 IP 用于计算机之间的通信。 IP 是无连接的通信协议。它不会占用两个正在通信的计算机之间的通信线路。这样,IP 就降低了对网络线路的需求。每条线可以同时满足许多不同的计算机之间的通信需要。 通过IP,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。 IP 负责将每个包路由至它的目的地。 IP地址 每个计算机必须有一个IP 地址才能够连入因特网。 每个IP 包必须有一个地址才能够发送到另一台计算机。

TCP协议控制窗口算法实现

TCP协议作为?一个可靠的?面向流的传输协议,其可靠性和流量量控制由滑动窗?口协议保证,?而拥塞控制则由控制窗?口结合?一系列列的控制算法实现。?一、滑动窗?口协议关于这部分?自?己不不晓得怎么叙述才好,因为理理解的部分更更多,下?面就?用?自?己的理理解来介绍下TCP的精髓:滑动窗?口协议。所谓滑动窗?口协议,?自?己理理解有两点:1. “窗?口”对应的是?一段可以被发送者发送的字节序列列,其连续的范围称之为“窗?口”;2. “滑动”则是指这段“允许发送的范围”是可以随着发送的过程?而变化的,?方式就是按顺序“滑动”。在引?入?一个例例?子来说这个协议之前,我觉得很有必要先了了解以下前提: -1. TCP协议的两端分别为发送者A和接收者B,由于是全双?工协议,因此A和B应该分别维护着?一个独?立的发送缓冲区和接收缓冲区,由于对等性(A发B收和B发A收),我们以A发送B接收的情况作为例例?子; -2. 发送窗?口是发送缓存中的?一部分,是可以被TCP协议发送的那部分,其实应?用层需要发送的所有数据都被放进了了发送者的发送缓冲区; -3. 发送窗?口中相关的有四个概念:已发送并收到确认的数据(不不再发送窗?口和发送缓冲区之内)、已发送但未收到确认的数据(位于发送窗?口之中)、允许发送但尚未发送的数据以及发送窗?口外发送缓冲区内暂时不不允许发送的数据; -4. 每次成功发送数据之后,发送窗?口就会在发送缓冲区中按顺序移动,将新的数据包含到窗?口中准备发送;TCP建?立连接的初始,B会告诉A?自?己的接收窗?口?大?小,?比如为‘20’:字节31-50为发送窗?口 A发送11个字节后,发送窗?口位置不不变,B接收到了了乱序的数据分组: 只有当A成功发送了了数据,即发送的数据得到了了B的确认之后,才会移动滑动窗?口离开已发送的数据;同时B则确认连续的数据分组,对于乱序的分组则先接收下来,避免?网络重 复传递: ?二、流量量控制流量量控制?方?面主要有两个要点需要掌握。?一是TCP利利?用滑动窗?口实现流量量控制的机制;?二是如何考虑流量量控制中的传输效率。 1. 流量量控制所谓流量量控制,主要是接收?方传递信息给发送?方,使其不不要发送数 据太快,是?一种端到端的控制。主要的?方式就是返回的ACK中会包含?自?己的接收窗?口的?大?小,并且利利?用?大?小来控制发送?方的数据发送: 这?里里?面涉及到?一种情况,如果B已经告诉A?自?己的缓冲区已满,于是A停?止发送数据;等 待?一段时间后,B的缓冲区出现了了富余,于是给A发送报?文告诉A我的rwnd?大?小为400,但是这个报?文不不幸丢失了了,于是就出现A等待B的通知||B等待A发送数据的死锁状态。为了了 处理理这种问题,TCP引?入了了持续计时器?(Persistence timer),当A收到对?方的零窗 ?口通知时,就启?用该计时器?,时间到则发送?一个1字节的探测报?文,对?方会在此时回应?自 身的接收窗?口?大?小,如果结果仍未0,则重设持续计时器?,继续等待。

基于TCP协议的网络通信设计与实现

基于TCP协议下的简单网络通信与实现 摘要 本文设计并实现了在Windows下基于局域网内的TCP协议的简单即时通信系统,系统采用TCP/IP模式,底层通信通过SOCKET套接字接口对端口进行监听,当有消息发送来时,做出相应的处理,服务器负责客户端的登录验证。本文首先讨论了套接字创建、绑定、将套接字设置为监听模式、接受信息和关闭套接字从而实现简单的网络通信,然后阐述了如何使用C++来模拟基于TCP协议下的客户服务方式的网络通信过程。由于在此设计中主要是使用C程序的形式来模拟TCP协议的传输方式,从而实现面向对象的可靠传输,在这种情况下无需对IP协议进行讨论。 关键字:套接字TCP协议

目录 1、引言………………………………………………………………………………….... 1.1、课程背景............................................................................................................... 1.2、相关技术介绍....................................................................................................... 1.3、TCP协议………………………………………………………………………… 1.4、TCP——传输控制协议…………………………………………………………. 1.5、套接字…………………………………………………………………………… 2、系统框架......................................................................................................................... 3、系统设计流程图............................................................................................................. 4、系统的实现..................................................................................................................... 4.1、服务器端程序.............................................................................................................. 4.2、客户端程序.................................................................................................................. 结论…………………………………………………………………………………… 参考文献………………………………………………………………………………

用C#实现基于TCP协议的网络通讯

用C#实现基于TCP协议的网络通讯 发布时间: 2009-10-23 15:12 阅读: 6657 次推荐: 2 [收藏] TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程。然而TCP 协议是一个庞杂的体系,要彻底的弄清楚它的实现不是一天两天的功夫,所幸的是在.net framework环境下,我们不必要去追究TCP协议底层的实现,一样可以很方便的编写出基于TCP协议进行网络通讯的程序。 要进行基于TCP协议的网络通讯,首先必须建立同远程主机的连接,连接地址通常包括两部分——主机名和端口,如https://www.360docs.net/doc/2f6600070.html,:80中,https://www.360docs.net/doc/2f6600070.html,就是主机名,80指主机的80端口,当然,主机名也可以用IP地址代替。当连接建立之后,就可以使用这个连接去发送和接收数据包,TCP协议的作用就是保证这些数据包能到达终点并且能按照正确的顺序组装起来。 在.net framework的类库(Class Library)中,提供了两个用于TCP网络通讯的类,分别是TcpClient和TcpListener。由其英文意义显而易见,TcpClient类是基于TCP协议的客户端类,而TcpListener是服务器端,监听(Listen)客户端传来的连接请求。TcpClient类通过TCP协议与服务器进行通讯并获取信息,它的内部封装了一个Socket类的实例,这个Socket对象被用来使用TCP协议向服务器请求和获取数据。因为与远程主机的交互是以数据流的形式出现的,所以传输的数据可以使用.net framework中流处理技术读写。在我们下边的例子中,你可以看到使用NetworkStream类操作数据流的方法。 在下面的例子中,我们将建立一个时间服务器,包括服务器端程序和客户端程序。服务器端监听客户端的连接请求,建立连接以后向客户端发送当前的系统时间。 先运行服务器端程序,下面截图显示了服务器端程序运行的状况: 然后运行客户端程序,客户端首先发送连接请求到服务器端,服务器端回应后发送当前时间到客户端,这是客户端程序的截图: 发送完成后,服务器端继续等待下一次连接: 通过这个例子我们可以了解TcpClient类的基本用法,要使用这个类,必须使用https://www.360docs.net/doc/2f6600070.html,.Socket命名空间,本例用到的三个命名空间如下:

TCPIP协议简要分析

TCP/IP协议简要分析 摘要 一、绪论 在网络应用日益普遍ARMTCP/IP协议的今天,越来越多的嵌入式设备实现Internet 网络化。TCP/IP协议是一种目前被广泛采用的网络协议。嵌入式Internet的技术核心是在嵌入式系统中部分或完整地实现TCP/IP协议。由于TCP/IP协议比较复杂,而目前ARMTCP/IP协议嵌入式系统中大量应用低速处理器,受内存和速度限制,有必要将TCP/IP 协议简化。 嵌入式TCP/IP协议一般实现:ARP/RARP、、IP、ICMP、TCP、UDP、HTTP、SMTP、FTP、TELNET等协议 工业控制ARMTCP/IP协议领域传输层采用TCP协议、不用UDP协议,是考虑到实时监控系统中传输量并不大,而可靠性要求较高。TCP协议是面向连接的、端对端的可靠ARMTCP/IP协议通信协议。它采用了许多机制来保证可靠传输,应用于嵌入式系统显得过于ARMTCP/IP协议复杂。 TCP/IP是一个四层的分层体系结构。高层为传输控制协议,它负责聚集信息或把文件拆分成更小的包。这些包通过网络传送到接收端的TCP层,接收端的TCP层把包还原为原始文件。低层是网际协议,它处理每个包的地址部分,使这些包正确的到达目的地。网络上的网关计算机根据信息的地址来进行路由选择。即使来自同一文件的分包路由也有可能不同,但最后会在目的地汇合。TCP/IP使用客户端/服务器模式进行通信。TCP/IP通信是点对点的,意思是通信是网络中的一台主机与另一台主机之间的。TCP/IP与上层应用程序之间可以说是“没有国籍的”,因为每个客户请求都被看做是与上一个请求无关的。正是它们之间的“无国籍的”释放了网络路径,才是每个人都可以连续不断的使用网络。许多用户熟悉使用TCP/IP协议的高层应用协议。包括万维网的超文本传输协议(HTTP),文件传输协议(FTP),远程网络访问协议(Telnet)和简单邮件传输协议(SMTP)。这些协议通常和TCP/IP协议打包在一起。使用模拟电话调制解调器连接网络的个人电脑通常是使用串行线路接口协议(SLIP)和点对点协议(P2P)。这些协议压缩IP包后通过拨号电话线发送到对方的调制解调器中。与TCP/IP协议相关的协议还包括用户数据报协议(UDP),它代替TCP/IP协议来达到特殊的目的。其他协议是网络主机用来交换路由信息的,包括Internet控制信息协议(ICMP),内部网关协议(IGP),外部网关协议(EGP),边界网关协议(BGP)。 关键字:TCP IP Internet

TCP协议简述

TCP协议简述 TCP(传输控制协议)提供的了一种可靠的数据流服务,采用“带重传的确认”技术来实现传输的可靠性。 一、TCP协议中涉及了诸多规则来保障通信链路的可靠性,主要有以下几点: 1、面向连接。 2、将应用层的数据分割成最适合发送的数据块。 3、重传机制。规定时间内未收到确认包,重传数据。 4、对首部和数据进行校验。 5、对收到的数据进行排序,然后交给应用层,丢弃重复的数据。 6、还提供流量控制。 二、TCP包的首部 1、16bit源端口号和16bit目的端口号用于寻找发送端和接收端的进程,通过端口号和IP地址,可以唯一确定一个TCP连接。 2、序号是用来标识从TCP发端向TCP接收端发送的数据序号。 3、确认序号包含发送确认的一端所期望收到的下一个序号,因此,确认序号是上次已经成功收到数据序号加1. 4、首部长度指出了TCP首部的长度值,若不存在选项,则这个值为20字节。 5、标志位(flag) 标志位为1时,表示相对应的位有效。 URG: 紧急指针有效;ACK:确认序号有效; PSH:接收方应尽快将这个报文段交给应用层; RST:重建连接; SYN:同步序号用来发起一个连接; FIN:发端完成发送任务(主动关闭); 三、连接的建立与释放 1、连接建立

建立一个TCP连接,必须经历三次握手过程,其中发送第一个SYN的一端将执行主动打开,接收这个SYN并发回下一个SYN的另一端执行被动打开。 2、连接终止 要释放一个TCP连接,需要通过四次握手过程,这是由TCP的半关闭特性造成的,因为TCP连接时全双工的,因此,需要TCP两端要单独执行关闭。值得注意的是,主动关闭的一端在发送FIN之后,依然还能正常接收对方的数据,只是通知对方它已经没有数据需要发送了。同理,被动关闭的一端在收到FIN之后,仍然可以发送数据,直到它自身同样发出FIN之后,才停止发送数据。

什么是TCP协议

什么是TCP/IP协议 TCP/IP是Transmission Control Protocol/Internet Protocol的简写,中文译名为传输控制协议/互联网络协议)协议是Internet最基本的协议,简单地说,就是由底层的IP协议和TCP协议组成的。在Internet 没有形成之前,各个地方已经建立了很多小型的网络,称为局域网。Internet的中文意义是"网际网",它实际上就是将全球各地的局域网连接起来而形成的一个"网之间的网(即网际网)"。然而,在连接之前的各式各样的局域网却存在不同的网络结构和数据传输规则,将这些小网连接起来后各网之间要通过什么样的规则来传输数据呢?这就象世界上有很多个国家,各个国家的人说各自的语言,世界上任意两个人要怎样才能互相沟通呢?如果全世界的人都能够说同一种语言(即世界语),这个问题不就解决了吗?TCP/IP协议正是Internet上的"世界语"。 TCP/IP的参考模型 要理解Internet,并不是一件非常容易的事,TCP/IP协议的开发研制人员将Internet分为五个层次,以便于理解,它也称为互联网分层模型或互联网分层参考模型, 如下表: 应用层(第五层) 传输层(第四层) 互联网层(第三层) 网络接口层(第二层) 物理层(第一层) 下面对这五个层次作一些讲解,初学者对这些概念有一个感性的认识就可以了,如果想深入学习这些内容,可以参考有关计算机网络底层知识方面的书籍。 ·物理层:对应于网络的基本硬件,这也是Internet物理构成,即我们可以看得见的硬件设备,如PC机、互连网服务器、网络设备等,必须对这些硬件设备的电气特性作一个规范,使这些设备都能够互相连接并兼容使用。 ·网络接口层:它定义了将数据组成正确帧的规程和在网络中传输帧的规程,帧是指一串数据,它是数据在网络中传输的单位。 ·互联网层:本层定义了互联网中传输的"信息包"格式,以及从一个用户通过一个或多个路由器到最终目标的"信息包"转发机制。 ·传输层:为两个用户进程之间建立、管理和拆除可靠而又有效的端到端连接。 ·应用层:它定义了应用程序使用互联网的规程。TCP/IP 通信协议1--网际协议IP Internet 上使用的一个关键的低层协议是网际协议,通常称IP协议。我们利用一个共同遵守的通信协议,从而使Internet 成为一

Tcp通信协议

TCP即Transmission Control Protocol,传输控制协议。与UDP不同,它是面向连接和数据流的可靠传输协议。也就是说,它能使一台计算机上的数据无差错的发往网络上的其他计算机,所以当要传输大量数据时,我们选用TCP协议。 TCP协议的程序使用的是客户端/服务器模式,在Qt中提供了QTcpSocket类来编写客户端程序,使用QTcpServer类编写服务器端程序。我们在服务器端进行端口的监听,一旦发现客户端的连接请求,就会发出newConnection()信号,我们可以关联这个信号到我们自己的槽函数,进行数据的发送。而在客户端,一旦有数据到来就会发出readyRead()信号,我们可以关联此信号,进行数据的接收。其实,在程序中最难理解的地方就是程序的发送和接收了,为了让大家更好的理解,我们在这一节只是讲述一个传输简单的字符串的例子,在下一节再进行扩展,实现任意文件的传输。 该文档描述了Tcp通信协议的过程。该项目的功能是客户端控制服务器中的灯和蜂鸣器。该协议中设定了灯为0x00,其中灯亮为0x01、灯灭为0x02。设定蜂鸣器为0x01,其中蜂鸣器响为0x01、蜂鸣器关闭为0x02。若成功则返回0x00否则返回0x01。 TCP服务器端: 在服务器端的程序中我们监听任何一台计算机的端口,这里使用的是6666,然后我们关联newConnection()信号和自己写的槽newConnection(),在该槽中我们关联readyRead()信号和自己写的receiveMessage()接收客户端数据的槽。 注:在写通信协议时服务器端要用结构体指针进行编写,这样更方便通信协议的更改。要用结构体指针指向QByteArry 的对象中的数据部分的首地址,可将结构体中的变量与data()中的数据对应,用结构体指针指向结构体变量取出QByteArry中的数据,这就是用结构体来传送数据。 .h中: 1)、定义两个结构体一个是接收客户端发来的数据结构体、此时用结构体指针(CTRL *a;)指向数据首地址,一个是返回客户端结果的结构体、将结果返回给客户端。并相应定义两个私有的结构体指针RESULT *result;CTRL *ctrl; .h中:两个结构体为预处理命令 #pragma pack(push,1)//为了结构体中变量字节对齐改变了按照以最大字节对 齐规则。接收客户端发来的数据结构体 typedef struct { char objects; char results; }RESULT; #pragma pack(pop) #pragma pack(push,1)//返回客户端结果的结构体 typedef struct

TCP协议代码

TCP ECHO 服务器端 // server.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #pragma comment(lib,"ws2_32.lib") #include #include #include #include int _tmain(int argc, _TCHAR* argv[]) {WSAData wsaData; int err = WSAStartup(WINSOCK_VERSION,&wsaData); if(0!=err) {return -1;} SOCKET sock= socket(AF_INET, SOCK_STREAM, 0); if(INV ALID_SOCKET==sock) { printf("socket() Failed: %d\n",WSAGetLastError()); WSACleanup();return -1;} sockaddr_in LocaAddr; LocaAddr.sin_family = AF_INET; LocaAddr.sin_port=htons(10000); LocaAddr.sin_addr.s_addr=htonl(INADDR_ANY); err = bind(sock, (sockaddr *)&LocaAddr, sizeof(LocaAddr)); if(SOCKET_ERROR==err) { printf("bind() Failed: %d\n",WSAGetLastError()); closesocket(sock);WSACleanup();return -1;} err=listen(sock,5); if(SOCKET_ERROR==err) {printf("listen() Failed:%d\n", WSAGetLastError()); closesocket(sock);WSACleanup();return -1;} sockaddr_in ClientAddr; int AddrLen =sizeof(ClientAddr); SOCKET sockConnected=accept(sock,(sockaddr*) &ClientAddr,&AddrLen); if(INV ALID_SOCKET==sockConnected) {printf("accpet() Failed:%d\n", WSAGetLastError()); closesocket(sock);WSACleanup();return -1;} char rbuf[1024]; while(1) {memset(rbuf,0,1024); int rByte = recv(sockConnected,rbuf,1024,0); if(SOCKET_ERROR==rByte) /*出错处理*/ {printf("recv Failed: %d\n",WSAGetLastError());

相关主题
相关文档
最新文档