




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C# socket 编程viewplaincopytoclipboardprint?usingsystem.threadingnamespacesockettestclassprogramstaticvoidmain(stringargs)threadstartts1=socketsendthreadstartts2=socketreceivethreadt1=newthread(ts1)threadt2=newthread(ts2)t1.start()t2.start()console.readline()privatevoidwritewebip()vara=.dns.gethostaddresses()foreach(vartempina)vartmp=temp.getaddressbytes()foreach(vartmp2intmp)console.write(tmp2.tostring()+.)console.writeline()/通过socket发送privatestaticvoidsocketsend()/准备发送的数据bytesendbyte=110074007074try/利用本机测试varaddress=dns.gethostaddresses(localhost).first()ipendpointipendpoint=newipendpoint(address5714)socketsocket=newsocket(ernetworksockettype.streamprotocoltype.tcp)socket.connect(ipendpoint)if(socket.connected)console.writeline(socket开始发送数据)socket.send(sendbyte)catch(exception1)console.writeline(1.tostring()/通过socket接收privatestaticvoidsocketreceive()bytereceivebyte=newbyte4socketsocket=newsocket(ernetworksockettype.streamprotocoltype.tcp)socket.bind(newipendpoint(ipaddress.any5714)socket.listen(int)socketoptionname.maxconnections)vara=socket.accept()if(a!=null)if(a.connected)console.writeline(socket开始接收数据)a.receive(receivebyte)foreach(vartempinreceivebyte)console.write(temp.tostring()+) 使用C#调用传统32位API实现串口操作,整个结构特别的简单。接收数据只需要定义数据接收事件即可。上传源代码我不会,需要源代码的请与我()联系。你也可以教我怎么上传源代码。usingSystem;usingSystem.Runtime.InteropServices;/(C)2003-2005C2217Studio保留所有权利/文件名称:IbmsSerialPort.cs/文件ID:/文件说明:/封装动态链接库IbmsSerialPort.dll的功能,提供在.NET环境中/串口异步接收和发送数据的功能。/当前版本:1.0/作者:邓杨均/创建日期:2005-2-2/最后修改日期:2005-2-2/历史修改记录:/namespaceIbms.Tool.IO/当串口接收到数据时,会产生一个事件。/SPRecvDataArgs就是该事件的参数,参数中的RecvData包含接收到的数据。/使用方法:/publicclassSPRecvDataArgs:EventArgs/接收到的数据组成的字节数组/privatebyterecvData;/构造函数,需要一个包含数据的byte作为初始化参数来实例化SPRecvDataArgs/接收到的数据publicSPRecvDataArgs(byterecvData)if(recvData=null)throw(newArgumentNullException();this.recvData=recvData;/返回接收到的数据内容/publicbyteRecvDatagetreturnrecvData;/封装动态链接库IbmsSerialPort.dll的功能,提供在.NET环境中异步/串口接收和发送功能。特别实现的是异步通过信号自动接收数据的模式。/publicclassIbmsSerialPort:IDisposable#region平台调用声明代码/声明IbmsSerialPort.dll的Ibms_OpenPort函数/串口号/波特率/DllImport(IbmsSerialPort.dll)publicstaticexternIntPtrIbms_OpenPort(intnPort,intnRate);/声明IbmsSerialPort.dll的Ibms_Close函数/DllImport(IbmsSerialPort.dll)publicstaticexternvoidIbms_Close(IntPtrport);/声明IbmsSerialPort.dll的Ibms_SendData函数/DllImport(IbmsSerialPort.dll)publicstaticexternboolIbms_SendData(IntPtrport,bytedata,intnDataSize);/声明IbmsSerialPort.dll的Ibms_SetFuncHandle函数/DllImport(IbmsSerialPort.dll)publicstaticexternvoidIbms_SetFuncHandle(IntPtrport,HandleFunchandDataFunc);#endregion#region定义字段/定义数据处理委托,作为API的函数指针传入动态链接库/publicdelegatevoidHandleFunc(IntPtrpData,intnDataSize);/定义数据接收事件的原型/publicdelegatevoidRecvData(objectsender,SPRecvDataArgse);/定义数据接收事件/publiceventRecvDataOnRecvData;/串口处理接收数据的委托/privateHandleFunc_handleDataFunc;/串口的编号,从1开始的整数,最大255/privateintport;/串口所支持的波特率,必须是标准波特率之一/privateStanderdRaterate;/串口当前的打开状态/privateboolopenStatus=false;/串口句柄/privateIntPtrportHandle;#region定义标准的串口波特率/标准的波特率/publicenumStanderdRateR50=50,R75=75,R110=110,R150=150,R300=300,R600=600,R1200=1200,R2400=2400,R4800=4800,R9600=9600,R19200=19200,R38400=38400,R57600=57600,R76800=76800,R115200=115200;#endregion#endregion#region定义方法/构造函数/publicIbmsSerialPort()portHandle=(IntPtr)0;_handleDataFunc=newHandleFunc(OnDllRecvData);/打开串口/串口号/波特率/抛出应用程序异常,包换错误描述publicvoidOpen(intnPort,StanderdRatenRate)if(nPort255|nPort0)throw(newArgumentOutOfRangeException();port=nPort;rate=nRate;portHandle=Ibms_OpenPort(port,(int)rate);if(IntPtr)0=portHandle)throw(newApplicationException(打开串口失败);/注册函数指针Ibms_SetFuncHandle(portHandle,_handleDataFunc);openStatus=true;/关闭串口/publicvoidClose()if(openStatus)Ibms_Close(portHandle);openStatus=false;/发送数据/数据内容/抛出应用程序异常,包换错误描述publicvoidSendData(bytedata)if(!openStatus)throw(newApplicationException(串口没有打开,发送数据失败);if(!Ibms_SendData(portHandle,data,data.Length)throw(newApplicationException(串口发送数据失败);/处理接收到的串口数据/串口数据接收缓冲区首地址/数据大小,一般数据大小不超过2KunsafeprotectedvoidOnDllRecvData(IntPtrpUnhandleData,intnDataSize)intdataSize=nDataSize;byte*pData=(byte*)pUnhandleData;bytedata=newbytedataSize;/复制数据到byte数组for(inti=0;idataSize;i+)datai=pDatai;/激发事件OnRecvData(this,newSPRecvDataArgs(data);#endregion#region定义属性/返回当前的串口号/publicintPortgetreturnport;/返回当前串口的波特率/publicStanderdRateRategetreturn用C实现Des加密和解密usingSystem;usingSystem.IO;usingSystem.Security.Cryptography;namespaceVavic/Security的摘要说明。/publicclassSecurityconststringKEY_64=VavicApp;conststringIV_64=VavicApp;/注意了,是8个字符,64位publicSecurity()/TODO:在此处添加构造函数逻辑/publicstaticstringEncode(stringdata)bytebyKey=System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);bytebyIV=System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);DESCryptoServiceProvidercryptoProvider=newDESCryptoServiceProvider();inti=cryptoProvider.KeySize;MemoryStreamms=newMemoryStream();CryptoStreamcst=newCryptoStream(ms,cryptoProvider.CreateEncryptor(byKey,byIV),CryptoStreamMode.Write);StreamWritersw=newStreamWriter(cst);sw.Write(data);sw.Flush();cst.FlushFinalBlock();sw.Flush();returnConvert.ToBase64String(ms.GetBuffer(),0,(int)ms.Length);publicstaticstringDecode(stringdata)bytebyKey=System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);bytebyIV=System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);bytebyEnc;trybyEnc=Convert.FromBase64String(data);catchreturnnull;DESCryptoServiceProvidercryptoProvider=newDESCryptoServiceProvider();MemoryStreamms=newMemoryStream(byEnc);CryptoStreamcst=newCryptoStream(ms,cryptoProvider.CreateDecryptor(byKey,byIV),CryptoStreamMode.Read);StreamReadersr=newStreamReader(cst);returnsr.ReadToEnd();C# 调用API函数在.NetFrameworkSDK文档中,关于调用WindowsAPI的指示比较零散,并且其中稍全面一点的是针对VisualB讲述的。本文将C#中调用API的要点汇集如下,希望给未在C#中使用过API的朋友一点帮助。另外如果安装了VisualS的话,在C:ProgramFilesMicrosoftVisualStudio.NETFrameworkSDKSamplesTechnologiesInteropPlatformInvokeWinAPIsCS目录下有大量的调用API的例子。一、调用格式usingSystem.Runtime.InteropServices;/引用此名称空间,简化后面的代码./使用DllImportAttribute特性来引入api函数,注意声明的是空方法,即方法体为空。DllImport(user32.dll)publicstaticexternReturnTypeFunctionName(typearg1,typearg2,.);/调用时与调用其他方法并无区别可以使用字段进一步说明特性,用逗号隔开,如:DllImport(kernel32,EntryPoint=GetVersionEx)DllImportAttribute特性的公共字段如下:1、CallingConvention指示向非托管实现传递方法参数时所用的CallingConvention值。CallingConvention.Cdecl:调用方清理堆栈。它使您能够调用具有varargs的函数。CallingConvention.StdCall:被调用方清理堆栈。它是从托管代码调用非托管函数的默认约定。2、CharSet控制调用函数的名称版本及指示如何向方法封送String参数。此字段被设置为CharSet值之一。如果CharSet字段设置为Unicode,则所有字符串参数在传递到非托管实现之前都转换成Unicode字符。这还导致向DLLEntryPoint的名称中追加字母“W”。如果此字段设置为Ansi,则字符串将转换成ANSI字符串,同时向DLLEntryPoint的名称中追加字母“A”。大多数Win32API使用这种追加“W”或“A”的约定。如果CharSet设置为Auto,则这种转换就是与平台有关的(在WindowsNT上为Unicode,在Windows98上为Ansi)。CharSet的默认值为Ansi。CharSet字段也用于确定将从指定的DLL导入哪个版本的函数。CharSet.Ansi和CharSet.Unicode的名称匹配规则大不相同。对于Ansi来说,如果将EntryPoint设置为“MyMethod”且它存在的话,则返回“MyMethod”。如果DLL中没有“MyMethod”,但存在“MyMethodA”,则返回“MyMethodA”。对于Unicode来说则正好相反。如果将EntryPoint设置为“MyMethod”且它存在的话,则返回“MyMethodW”。如果DLL中不存在“MyMethodW”,但存在“MyMethod”,则返回“MyMethod”。如果使用的是Auto,则匹配规则与平台有关(在WindowsNT上为Unicode,在Windows98上为Ansi)。如果ExactSpelling设置为true,则只有当DLL中存在“MyMethod”时才返回“MyMethod”。3、EntryPoint指示要调用的DLL入口点的名称或序号。如果你的方法名不想与api函数同名的话,一定要指定此参数,例如:DllImport(user32.dll,CharSet=CharSet.Auto,EntryPoint=MessageBox)publicstaticexternintMsgBox(IntPtrhWnd,stringtxt,stringcaption,inttype);4、ExactSpelling指示是否应修改非托管DLL中的入口点的名称,以与CharSet字段中指定的CharSet值相对应。如果为true,则当DllImportAttribute.CharSet字段设置为CharSet的Ansi值时,向方法名称中追加字母A,当DllImportAttribute.CharSet字段设置为CharSet的Unicode值时,向方法的名称中追加字母W。此字段的默认值是false。5、PreserveSig指示托管方法签名不应转换成返回HRESULT、并且可能有一个对应于返回值的附加out,retval参数的非托管签名。6、SetLastError指示被调用方在从属性化方法返回之前将调用Win32APISetLastError。true指示调用方将调用SetLastError,默认为false。运行时封送拆收器将调用GetLastError并缓存返回的值,以防其被其他API调用重写。用户可通过调用GetLastWin32Error来检索错误代码。二、参数类型:1、数值型直接用对应的就可。(DWORD-int,WORD-Int16)2、API中字符串指针类型-.net中string3、API中句柄(dWord)-.net中IntPtr4、API中结构-.net中结构或者类。注意这种情况下,要先用StructLayout特性限定声明结构或类公共语言运行库利用StructLayoutAttribute控制类或结构的数据字段在托管内存中的物理布局,即类或结构需要按某种方式排列。如果要将类传递给需要指定布局的非托管代码,则显式控制类布局是重要的。它的构造函数中用LayoutKind值初始化StructLayoutAttribute类的新实例。LayoutKind.Sequential用于强制将成员按其出现的顺序进行顺序布局。LayoutKind.Explicit用于控制每个数据成员的精确位置。利用Explicit,每个成员必须使用FieldOffsetAttribute指示此字段在类型中的位置。如:StructLayout(LayoutKind.Explicit,Size=16,CharSet=CharSet.Ansi)publicclassMySystemTimeFieldOffset(0)publicushortwYear;FieldOffset(2)publicushortwMonth;FieldOffset(4)publicushortwDayOfWeek;FieldOffset(6)publicushortwDay;FieldOffset(8)publicushortwHour;FieldOffset(10)publicushortwMinute;FieldOffset(12)publicushortwSecond;FieldOffset(14)publicushortwMilliseconds;下面是针对API中OSVERSIONINFO结构,在.net中定义对应类或结构的例子:/*API中定义原结构声明*OSVERSIONINFOASTRUCT*dwOSVersionInfoSizeDWORD?*dwMajorVersionDWORD?*dwMinorVersionDWORD?*dwBuildNumberDWORD?*dwPlatformIdDWORD?*szCSDVersionBYTE128dup(?)*OSVERSIONINFOAENDS*OSVERSIONINFOequ*/.net中声明为类StructLayout(LayoutKind.Sequential)publicclassOSVersionInfopublicintOSVersionInfoSize;publicintmajorVersion;publicintminorVersion;publicintbuildNumber;publicintplatformId;MarshalAs(UnmanagedType.ByValTStr,SizeConst=128)publicStringversionString;/或者/.net中声明为结构StructLayout(LayoutKind.Sequential)publicstructOSVersionInfo2publicintOSVersionInfoSize;publicintmajorVersion;publicintminorVersion;publicintbuildNumber;publicintplatformId;MarshalAs(UnmanagedType.ByValTStr,SizeConst=128)publicStringversionString;此例中用到MashalAs特性,它用于描述字段、方法或参数的封送处理格式。用它作为参数前缀并指定目标需要的数据类型。例如,以下代码将两个参数作为数据类型长指针封送给WindowsAPI函数的字符串(LPStr):MarshalAs(UnmanagedType.LPStr)Stringexistingfile;MarshalAs(UnmanagedType.LPStr)Stringnewfile;注意结构作为参数时候,一般前面要加上ref修饰符,否则会出现错误:对象的引用没有指定对象的实例。DllImport(kernel32,EntryPoint=GetVersionEx)publicstaticexternboolGetVersionEx2(refOSVersionInfo2osvi);三、如何保证使用托管对象的平台调用成功?如果在调用平台invoke后的任何位置都未引用托管对象,则垃圾回收器可能将完成该托管对象。这将释放资源并使句柄无效,从而导致平台invoke调用失败。用HandleRef包装句柄可保证在平台invoke调用完成前,不对托管对象进行垃圾回收。例如下面:FileStreamfs=newFileStream(a.txt,FileMode.Open);StringBuilderbuffer=newStringBuilder(5);intread=0;ReadFile(fs.Handle,buffer,5,outread,0);/调用WinAPI中的ReadFile函数由于fs是托管对象,所以有可能在平台调用还未完成时候被垃圾回收站回收。将文件流的句柄用HandleRef包装后,就能避免被垃圾站回收:DllImport(Kernel32.dll)publicstaticexternboolReadFile(HandleRefhndRef,StringBuilderbuffer,intnumberOfBytesToRead,outintnumberOfBytesRead,refOverlappedflag);.FileStreamfs=newFileStream(HandleRef.txt,FileMode.Open);HandleRefhr=newHandleRef(fs,fs.Handle);StringBuilderbuffer=newStringBuilder(5);intread=0;/platforminvokewillholdreferencetoHandleRefuntilcallendsReadFile(hr,buffer,5,outread,0);转贴自:/ 在.NetFrameworkSDK文档中,关于调用WindowsAPI的指示比较零散,并且其中稍全面一点的是针对VisualB讲述的。本文将C#中调用API的要点汇集如下,希望给未在C#中使用过API的朋友一点帮助。另外如果安装了VisualS的话,在C:ProgramFilesMicrosoftVisualStudio.NETFrameworkSDKSamplesTechnologiesInteropPlatformInvokeWinAPIsCS目录下有大量的调用API的例子。一、调用格式usingSystem.Runtime.InteropServices;/引用此名称空间,简化后面的代码./使用DllImportAttribute特性来引入api函数,注意声明的是空方法,即方法体为空。DllImport(user32.dll)publicstaticexternReturnTypeFunctionName(typearg1,typearg2,.);/调用时与调用其他方法并无区别可以使用字段进一步说明特性,用逗号隔开,如:DllImport(kernel32,EntryPoint=GetVersionEx)DllImportAttribute特性的公共字段如下:1、CallingConvention指示向非托管实现传递方法参数时所用的CallingConvention值。CallingConvention.Cdecl:调用方清理堆栈。它使您能够调用具有varargs的函数。CallingConvention.StdCall:被调用方清理堆栈。它是从托管代码调用非托管函数的默认约定。2、CharSet控制调用函数的名称版本及指示如何向方法封送String参数。此字段被设置为CharSet值之一。如果CharSet字段设置为Unicode,则所有字符串参数在传递到非托管实现之前都转换成Unicode字符。这还导致向DLLEntryPoint的名称中追加字母“W”。如果此字段设置为Ansi,则字符串将转换成ANSI字符串,同时向DLLEntryPoint的名称中追加字母“A”。大多数Win32API使用这种追加“W”或“A”的约定。如果CharSet设置为Auto,则这种转换就是与平台有关的(在WindowsNT上为Unicode,在Windows98上为Ansi)。CharSet的默认值为Ansi。CharSet字段也用于确定将从指定的DLL导入哪个版本的函数。CharSet.Ansi和CharSet.Unicode的名称匹配规则大不相同。对于Ansi来说,如果将EntryPoint设置为“MyMethod”且它存在的话,则返回“MyMethod”。如果DLL中没有“MyMeth
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 扫黑除恶与预防邪教课件
- 房地产销售营销知识培训课件
- 2025年卫校招生考试题目及答案
- 慢阻肺呼吸锻炼科普
- 慕课课件观看时长
- 文明纪检部考试题及答案
- 长治妇联考试题及答案
- 江苏交安考试真题及答案
- 深圳生物高考试卷及答案
- 济南护士招考试题及答案
- 弱电工程施工进度表(甘特图)
- 机械设备控制技术
- 智慧综合能源管理平台需求说明书
- 《欢腾的节日》 单元作业设计
- 文化创意产品设计PPT完整全套教学课件
- 2022公务员录用体检操作手册(试行)
- 赤峰市资源型城市经济转型开发试验区总体规划环境影响跟踪评价报告
- 体育经济学概论PPT全套教学课件
- 《西风的话》的教学反思(5篇)
- 现代汉语语法《虚词》教学设计共3篇
- GB/T 6219-1998半导体器件分立器件第8部分:场效应晶体管第一篇1GHz、5W以下的单栅场效应晶体管空白详细规范
评论
0/150
提交评论