请教:C#和VC6++网络异步编程

问题描述

具体功能室这样:用C#实现一个服务器功能,用VC6++实现一个客户端功能,服务器启动之后,等待客户端连接,然后接受客户端发过来的字符串。现在的问题是,客户端每次发送之前,都必须先连接一次,我想只需连接一次,然后多次不间断发送。请高手帮解答-------------------------------------服务器端代码(C#)namespaceSocketServer{publicdelegatevoidDelLink(stringstrTemp,stringstrTemp1);publicdelegatevoidTextShowHandeler(stringMessage);publicpartialclassFormServer:Form{privateAsyasyTemp=newAsy();privateDelLinklinkSocket;publicFormServer(){InitializeComponent();linkSocket=newDelLink(asyTemp.BeginAccept);asyTemp.tshMessage+=newTextShowHandeler(this.Appendtext);}privatevoidbuttonOk_Click(objectsender,EventArgse){stringIP=this.textBoxIp.Text;stringPort=this.textBoxPort.Text;this.buttonOk.Enabled=false;linkSocket.BeginInvoke(IP,Port,null,null);}privatevoidbuttonCancle_Click(objectsender,EventArgse){this.Close();}publicvoidAppendtext(stringMessage){if(this.textBoxReceive.InvokeRequired){//this.Invoke(asyTemp.tshMessage(Message));TextShowHandelerd=newTextShowHandeler(Appendtext);this.Invoke(d,newobject[]{Message});}else{this.textBoxReceive.AppendText(Message);if(Message.Length>30){this.toolStripStatusLabelSee.Text=Message.Remove(30)+"...";}else{this.toolStripStatusLabelSee.Text=Message;}}}}publicclassAsy{publicTextShowHandelertshMessage;publicvoidBeginAccept(stringIP,stringPort){intBUFFERSIZE=256;byte[]buffer=newbyte[BUFFERSIZE];Socketserver=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPEndPointiep=newIPEndPoint(IPAddress.Parse(IP),int.Parse(Port));server.Bind(iep);server.Listen(5);while(true){IAsyncResultresult=server.BeginAccept(newAsyncCallback(AcceptConn1),server);this.tshMessage("waitingforaconnection...n");result.AsyncWaitHandle.WaitOne();}}publicvoidAcceptConn1(IAsyncResultiar){this.tshMessage("asocketisconnected...n");Sockets=(Socket)iar.AsyncState;Sockethandler=s.EndAccept(iar);StateObjectstate=newStateObject();state.worksocket=handler;handler.BeginReceive(state.buffer,0,StateObject.BufferSize,0,newAsyncCallback(ReadCallBack),state);}publicvoidReadCallBack(IAsyncResultar){stringcontent=string.Empty;StateObjectstate=(StateObject)ar.AsyncState;Sockethandler=state.worksocket;intbytesRead=handler.EndReceive(ar);if(bytesRead>0){state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead));content=state.sb.ToString();this.tshMessage("Read"+content.Length+"bytesfromsocket.n");this.tshMessage("Data:"+content+"n");//Send(handler,content);}else{handler.BeginReceive(state.buffer,0,StateObject.BufferSize,0,newAsyncCallback(ReadCallBack),state);}}}publicclassStateObject{publicSocketworksocket=null;publicconstintBufferSize=1024;publicbyte[]buffer=newbyte[BufferSize];publicStringBuildersb=newStringBuilder();}}------------------------------客户端代码(VC++)voidCChatDlg::OnBtnSend(){//DWORDdwIP;CStringstrSend;WSABUFwsabuf;DWORDdwSend;intlen;CStringstrHostName;SOCKADDR_INaddrTo;addrTo.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");addrTo.sin_family=AF_INET;addrTo.sin_port=htons(8080);GetDlgItemText(IDC_EDIT_SEND,strSend);len=strSend.GetLength();wsabuf.buf=strSend.GetBuffer(len);wsabuf.len=len+1;if(SOCKET_ERROR==WSASendTo(m_socket,&wsabuf,1,&dwSend,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR),NULL,NULL)){inti=WSAGetLastError();MessageBox("发送数据失败!");closesocket(m_socket);WSACleanup();return;}else{MessageBox("发送数据成功!");}Display(strSend);}voidCChatDlg::OnConnect(){m_socket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);if(INVALID_SOCKET==m_socket){MessageBox("创建套接字失败!");closesocket(m_socket);//returnFALSE;}SOCKADDR_INaddrTo;addrTo.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");addrTo.sin_family=AF_INET;addrTo.sin_port=htons(8080);intiResult=connect(m_socket,(SOCKADDR*)&addrTo,sizeof(addrTo));if(iResult==SOCKET_ERROR){inti=WSAGetLastError();MessageBox("连接失败!");closesocket(m_socket);WSACleanup();}else{MessageBox("连接成功!");}}

时间: 2024-09-21 10:14:32

请教:C#和VC6++网络异步编程的相关文章

Python的Tornado框架异步编程入门实例_python

Tornado Tornado 是一款非阻塞可扩展的使用Python编写的web服务器和Python Web框架, 可以使用Tornado编写Web程序并不依赖任何web服务器直接提供高效的web服务.所以Tornado不仅仅是一个web框架而且还是一款可以用于生产环境的高效的web服务器 Torando 在Linux和FreeBSD上使用高效的异步I/O模型 epoll 和kqueue来实现高效的web服务器, 所以 tornado在Linux上和FreeBSD系列性能可以达到最高接口 当然我

异步编程-cuda编程多gpu问题请教

问题描述 cuda编程多gpu问题请教 用两个gpu进行编程的时候,有一个gpu得到的结果是正确的,另一个始终不正确 解决方案 http://www.docin.com/p-680392737.html 解决方案二: 是不是某些数据要加锁?还是数据上传下载出问题了 解决方案三: GPU-cuda编程葵花宝典

对 ASP.NET 异步编程的一点理解

本来这篇博文想探讨下异步中的异常操作,但自己在做异步测试的时候,又对 ASP.NET 异步有了新的认识,可以说自己之前对异步的理解还是有些问题,先列一下这篇博文的三个解惑点: async await 到底是什么鬼??? 异步操作中发生异常,该如何处理? 异步操作中发生异常(有无 catch throw 情况),Application_Error 会不会捕获? 之前测试过异步中的同步(很多种情况),这次我们把测试代码写更复杂些(异步中再进行异步),代码如下: [Route("")]  [

C#编程总结(六)异步编程

1.什么是异步? 异步操作通常用于执行完成时间可能较长的任务,如打开大文件.连接远程 计算机或查询数据库.异步操作在主应用程序线程以外的线程中执行.应用程序调用方法异步执行某个 操作时,应用程序可在异步方法执行其任务时继续执行. 2.同步与异步的区别 同步 (Synchronous):在执行某个操作时,应用程序必须等待该操作执行完成后才能继续执行. 异 步(Asynchronous):在执行某个操作时,应用程序可在异步操作执行时继续执行.实质:异步操作, 启动了新的线程,主线程与方法线程并行执行

Asp.Net异步编程知识

写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog 随着.Net4.5的推出,一种新的编程方式简化了异步编程,在网上时不时的也看到各种打着Asp.Net异步编程的口号,如何提高性能,如何提高吞吐率! 好多文章都说得不清楚,甚至是错误的.只看到了一些表现,混淆概念.希望这篇文章能够能够对一部分人理解Asp.net异步编程模型. 1基础知识,谈一个初学者不容易理解的基础知识,这个基础知识,很不基础的哦 先看这个代码 ThreadPool.GetMaxTh

用 Groovy+Jetty 快速实现 Web 异步编程

为什么要异步编程 在现在大规模高并发的 WEB 应用中,由于硬件及网络的限制,I/O 处理速度相当较慢,往往 成为 WEB 系统的性能瓶颈.Node.js 通过非阻塞的 IO 和事件驱动很好的缓解了 Web 服务器在高并发时的资源占用,极大 的提高了 WEB 服务器对高并发的处理能力.同时 Node.js 带来的轻量快捷的异步编程给 WEB 开发带来了一股清新的空气 .那么对于广大的 Java 开发者来说,是否可以实现类似的 WEB 开发呢,答案是肯定的.利用 Groovy 动态语言.Jetty

并发事件: 实现CLR异步编程模型

通常 I/O 操作的特点是速度慢.不可预见.当应用程序执行同步 I/O 操作时,基本上会放弃对正在 完成实际工作的设备的控制.例如,如果应用程序调用 StreamRead 方法从 FileStream 或 NetworkStream 读取某些字节,我们无法预计该方法需要多长时间才能返回.如果正在被读取的文件位于 本地硬盘上,那么 Read 操作可能会立即返回.如果存储文件的远程服务器脱机,则 Read 方法可能会等 待几分钟,然后超时并引发异常.在此期间,发出同步请求的线程会被占用.如果该线程是

全面解析C#中的异步编程

  当我们处理一些长线的调用时,经常会导致界面停止响应或者IIS线程占用过多等问题,这个时候我们需要更多的是用异步编程来修正这些问题,但是通常都是说起来容易做起来难,诚然异步编程相对于同步编程来说,它是一种完全不同的编程思想,对于习惯了同步编程的开发者来说,在开发过程中难度更大,可控性不强是它的特点. 在.NET Framework5.0种,微软为我们系统了新的语言特性,让我们使用异步编程就像使用同步编程一样相近和简单,本文中将会解释以前版本的Framework中基于回调道德异步编程模型的一些限

Javascript单线程:异步编程的4种方法

你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推. 这种模式的好处是实现起来比较简单,执行环境相对单纯:坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行.常见的浏 览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其