请教socket的问题

问题描述

这是从csdn上下载的代码。先上代码服务器端privatevoidForm1_Load(objectsender,EventArgse){Control.CheckForIllegalCrossThreadCalls=false;//不捕捉错误线程提示try{serverSokcet=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPAddressip=IPAddress.Any;serverinfo=newIPEndPoint(ip,port);serverSokcet.Bind(serverinfo);//绑定ip地址serverSokcet.Listen(30);//开始监听,并且挂期数为10mss=newbyte[65535];clientSocket=newSocket[65535];clientNum=0;//从0开始计数//创建一个线程serverThread=newThread(newThreadStart(recieveAccept));serverThread.Start();}catch{}}privatevoidrecieveAccept(){while(true){clientSocket[clientNum]=serverSokcet.Accept();}}#regionprivateIPEndPointserverinfo;//存放服务器ip和端口privateSocketserverSokcet;//服务器端运行的socketprivateThreadserverThread;//服务器运行的线程privateSocket[]clientSocket;//存放客户端运行的socketprivateintclientNum;//存放客户端数量privatebyte[]mss;//消息intport=316;#endregionprivatevoidbutton2_Click(objectsender,EventArgse){try{Thread.Sleep(350);mss=Encoding.Unicode.GetBytes("Send");clientSocket[0].Send(mss);clientSocket[0].BeginReceive(mss,0,mss.Length,SocketFlags.None,newAsyncCallback(RecieveCallBack),clientSocket[0]);}catch{}}privatevoidRecieveCallBack(IAsyncResultar){try{mss=newbyte[1048576];intnumber=clientSocket[0].Receive(mss);Imageimg=CaptureScreen.ToImage(mss);img=CaptureScreen.BySizeGetScreen(img,pictureBox1.Width,pictureBox1.Height);if(img!=null){pictureBox1.Image=img;}clientSocket[0].BeginReceive(mss,0,mss.Length,SocketFlags.None,newAsyncCallback(RecieveCallBack),clientSocket[0]);}catch{}}

客户端privatevoidForm1_Load(objectsender,EventArgse){_mss=newbyte[65536];CheckForIllegalCrossThreadCalls=false;//允许子线程刷新数据Threadt=newThread(go);t.IsBackground=true;t.Start();Threadt1=newThread(recieveAccept);t1.IsBackground=true;t1.Start();}IPEndPointserverInfo;SocketclinentSocket;publicvoidgo(){try{lock(this){clinentSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);serverInfo=newIPEndPoint(IPAddress.Parse("192.168.1.140"),316);clinentSocket.Connect(serverInfo);intrend=clinentSocket.Receive(_mss);stringmsg=Encoding.Unicode.GetString(_mss,0,rend);if(msg=="Send"){MessageBox.Show("send");_mss=newbyte[65535];_mss=newMonitor().GetDesktopBitmapBytes();if(clinentSocket.Connected){clinentSocket.Send(_mss);clinentSocket.BeginSend(_mss,0,_mss.Length,SocketFlags.None,newAsyncCallback(ReceiveCallBack),clinentSocket);}}}}catch{go();}}///<summary>///回调函数///</summary>///<paramname="ar"></param>protectedvoidReceiveCallBack(IAsyncResultar){try{Socketlistener=(Socket)ar.AsyncState;_mss=newMonitor().GetDesktopBitmapBytes();if(listener.Connected){listener.BeginSend(_mss,0,_mss.Length,SocketFlags.None,newAsyncCallback(ReceiveCallBack),listener);}}catch{go();}}

下面问题就是服务器端监控的窗口是弹出式的,当我关闭这个弹出窗体在打开的时候,就会报错,说通常每个套接字地址(协议/网络地址/端口)只允许使用一次。请求大神帮忙。

解决方案

解决方案二:
请教帮助。这是一个局域网监控的项目,服务器端可以观看每一个客户端的屏幕,而且客户端也可以观看服务器端的屏幕,当然客户端监控室由服务器端发起的。
解决方案三:
不要胡乱加什么弹出窗口你的服务端真正运行起来之后,必然是无人操作的,而不可能派个人整天盯着看是否有弹窗,弹出了就关闭所以你所有的测试都应该是基于无弹出的设计否则你现在即使让它不报错了,等你把弹出拿掉,还是需要从头测试
解决方案四:
你使用了线程,这个线程跟你的窗体是无关的窗体关闭了,但是线程还在执行你再次打开窗体,就又开了一个线程
解决方案五:
引用2楼Z65443344的回复:

不要胡乱加什么弹出窗口你的服务端真正运行起来之后,必然是无人操作的,而不可能派个人整天盯着看是否有弹窗,弹出了就关闭所以你所有的测试都应该是基于无弹出的设计否则你现在即使让它不报错了,等你把弹出拿掉,还是需要从头测试

我弹窗是测试那个发送文字的东西。测试了,第一次能够监控,但是第二次就报错了,稍等给你看错误提示。
解决方案六:
如果你使用异步发送,异步接收,异步侦听,而不是同步阻塞while死循环那么就根本不需要把这些代码丢进线程里主线程发送接收就可以了具体可以自己测试没必要用线程的地方乱用线程反而会引发许多诡异的问题
解决方案七:
引用3楼Z65443344的回复:

你使用了线程,这个线程跟你的窗体是无关的窗体关闭了,但是线程还在执行你再次打开窗体,就又开了一个线程

解决方案八:
引用5楼Z65443344的回复:

如果你使用异步发送,异步接收,异步侦听,而不是同步阻塞while死循环那么就根本不需要把这些代码丢进线程里主线程发送接收就可以了具体可以自己测试没必要用线程的地方乱用线程反而会引发许多诡异的问题

这是从网上摘来的代码,个人对线程还是不太熟练。我在试试。
解决方案九:
你已经有一个线程对某个端口进行侦听再开一个线程还对这个端口进行侦听,就会报错了具体原因就是你关闭窗体的时候线程并没有自动退出,你也没有写任何代码让线程退出
解决方案十:
你抄的例子里,人家应该是当个真正的服务端程序运行在服务器上的而不是你这样把服务端也作为一个客户端来用例子代码根本没考虑窗口会没事被关闭又重新打开
解决方案十一:
而且作为一个"服务端",侦听是不应该被关闭的,应该随时侦听客户端的连接请求只不过你需要控制客户端和服务端什么时候交换报文(发送接收)否则你某个窗体被关闭,所有客户端就都连接不上你的服务端了,你还控制啥
解决方案十二:
引用10楼Z65443344的回复:

而且作为一个"服务端",侦听是不应该被关闭的,应该随时侦听客户端的连接请求只不过你需要控制客户端和服务端什么时候交换报文(发送接收)否则你某个窗体被关闭,所有客户端就都连接不上你的服务端了,你还控制啥

本来想的是创建个单例的类,不知道这样是不是太占用资源了?一直让她处于监听状态。感谢大神了。
解决方案十三:
引用10楼Z65443344的回复:

而且作为一个"服务端",侦听是不应该被关闭的,应该随时侦听客户端的连接请求只不过你需要控制客户端和服务端什么时候交换报文(发送接收)否则你某个窗体被关闭,所有客户端就都连接不上你的服务端了,你还控制啥

privatevoidFrm_StudentScreenForm_FormClosed(objectsender,FormClosedEventArgse){msgBuffer=Encoding.Unicode.GetBytes("stop");clientSocket[0].Send(msgBuffer);//clientSocket[0].BeginReceive(msgBuffer,0,msgBuffer.Length,SocketFlags.None,newAsyncCallback(RecieveCallBack),clientSocket[0]);if(serverThread!=null)serverThread.Abort();//线程终止if(serverSocket!=null){//CloseSocket();serverSocket.Close();//关闭SOCKET}//if(clientSocket.Length>=0)//{//clientSocket=newSocket[65535];//}this.Dispose();}protectedvoidCloseSocket(){if(serverSocket.Connected){//禁用发送和接受serverSocket.Shutdown(SocketShutdown.Both);//关闭套接字,不允许重用serverSocket.Disconnect(false);serverSocket.Close();}}

线程也种植了啊
解决方案十四:
引用11楼qq_30425243的回复:

Quote: 引用10楼Z65443344的回复:
而且作为一个"服务端",侦听是不应该被关闭的,应该随时侦听客户端的连接请求只不过你需要控制客户端和服务端什么时候交换报文(发送接收)否则你某个窗体被关闭,所有客户端就都连接不上你的服务端了,你还控制啥

本来想的是创建个单例的类,不知道这样是不是太占用资源了?一直让她处于监听状态。感谢大神了。

我觉得以你现在的需求,是把客户端和服务端弄反了被监控的那些电脑上跑的应该是服务端而监控电脑跑的是客户端这样你可以随时连接任何一个被监控机,也可以随时断开,而不必随时接收所有被监控电脑的数据
解决方案十五:
你开了2个线程,一个用来侦听,一个用来接收而你只终止了1个线程
解决方案:
最简单的办法当然是把侦听和接收放到一个线程里去有任何必要放2个线程在这里吗而且异步侦听,异步接收,都不阻塞代码而侦听,发送,接收,其实是很快的,根本不会阻塞UI所以这里根本没必要用线程
解决方案:
引用15楼Z65443344的回复:

最简单的办法当然是把侦听和接收放到一个线程里去有任何必要放2个线程在这里吗而且异步侦听,异步接收,都不阻塞代码而侦听,发送,接收,其实是很快的,根本不会阻塞UI所以这里根本没必要用线程

好的,我改改试试。线程的东西不太熟悉。
解决方案:
引用16楼qq_30425243的回复:

Quote: 引用15楼Z65443344的回复:
最简单的办法当然是把侦听和接收放到一个线程里去有任何必要放2个线程在这里吗而且异步侦听,异步接收,都不阻塞代码而侦听,发送,接收,其实是很快的,根本不会阻塞UI所以这里根本没必要用线程

好的,我改改试试。线程的东西不太熟悉。

我觉得你把客户端和服务端倒过来,就简单的多.既然所有控制都是在一台机器上,那么这台机器作为客户端去主动连接另外多台机器,这样多方便.不需要控制的机器,还去接收它的数据作甚
解决方案:
引用17楼Z65443344的回复:

Quote: 引用16楼qq_30425243的回复:
Quote: 引用15楼Z65443344的回复:
最简单的办法当然是把侦听和接收放到一个线程里去有任何必要放2个线程在这里吗而且异步侦听,异步接收,都不阻塞代码而侦听,发送,接收,其实是很快的,根本不会阻塞UI所以这里根本没必要用线程

好的,我改改试试。线程的东西不太熟悉。

我觉得你把客户端和服务端倒过来,就简单的多.既然所有控制都是在一台机器上,那么这台机器作为客户端去主动连接另外多台机器,这样多方便.不需要控制的机器,还去接收它的数据作甚

然后客户端也需要观看服务器的屏幕,就是教师讲课把屏幕让学生看,服务器也能监控学生的屏幕。
解决方案:
哦.明白了.其实你改为UDP可能更简单一些.UDP可以广播.这样你就不用把数据循环的往所有客户端发送.

时间: 2024-07-29 00:11:34

请教socket的问题的相关文章

请教socket的sendto耗时的问题

问题描述 请教socket的sendto耗时的问题 我连续发送两个32字节的包,第一个包sendto耗时20-30us而第二个包耗时7-12us,为什么有这么大的差距? 解决方案 建议你多测试几次,因为 sendto 大多数的情况下,只是将数据写入 socket 在系统层的数据缓冲中,而没有完成真正的数据发送过程. 也许第一次需要做一些额外的操作,只是你不知道.建议你测试一下,第3.4...次的时间,做一下对比.

请教SOCKET 服务端代码

问题描述 //监听函数publicvoidListen(){//初始化SOCKET实例newsock=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//初始化终结点实例localEP=newIPEndPoint(IPAddress.Any,setPort);try{//绑定newsock.Bind(localEP);//监听newsock.Listen(10);//用于设置按钮状态m_Listen

socket-C# Socket 粘包 半包 问题请教

问题描述 C# Socket 粘包 半包 问题请教 初学C#的Socket,求各位大侠指教个解决Socket粘包半包的方法. 我查阅了一些资料知道处理逻辑. 1,发送的消息都由包头+包体组成,包头解释包体长度 2,接收方定义个缓存区 3,判断接收的信息长度 4,先接收个包头 5,按照包头取包体 但是感觉好多逻辑不知道具体用代码怎么实现,请大侠指教. 伪代码也行,最最反应不过来的就是这个缓冲区怎么构建?? 它肯定得各种操作索引吧? 解决方案 http://www.cnblogs.com/solq/

浏览器-WEB端Socket相关的问题 请教

问题描述 WEB端Socket相关的问题 请教 1.有一个程序Demo,程序结构 客户端是WEB写的,服务端是用C++写的,WEB客户端刷新或者关闭浏览器,除了使用心跳包 WEB客户端是如何通知服务端Socket连接关闭的呢,哪位兄台有类似的经验还请赐教呢. 2.与第一个问题相关联的问题,WEB客户端每次登录服务端程序时,都会创建一个Socket连接,例如这个WEB客户端登录两次之后,服务端产生了两个Socket连接,如果服务端给每个连接的超时时间为60秒,当第一个超时服务端会关闭这个Socke

c语言-请教一个关于socket的问题

问题描述 请教一个关于socket的问题 代码中有这样一段 if ((m_UDPSndrSocket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET) { AfxMessageBox("Failed to create UDPSocket"); return FALSE; } 然后出现了这样的错误 error C2065: 'WSASocket'

插件-请教浏览器大神们,chrome上PPAPI socket回调数据为什么那么慢?

问题描述 请教浏览器大神们,chrome上PPAPI socket回调数据为什么那么慢? 如题,chrome上开发插件,通过PPAPI的tcp socket收取网络数据,但是并不是每个recv的数据包都通过事件立即回调,而是攒一段时间后才回调一堆数据,这造成延时增加啊,大神们知道怎么解决吗? 解决方案 https://www.zhihu.com/question/31227185/answer/56891840

即时通讯-刚开始学socket。。有个问题想要请教下

问题描述 刚开始学socket..有个问题想要请教下 我编的是最简单的一个即时通讯,客户端连接,然后服务端接收,客户端中的连接按键有这些代码,但是运行后出现debug assertion failed sockcore.cpp 644,我反复检查了代码感觉没有错误啊 BYTE nFild[4]; CString sIP; UpdateData(); m_ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]); sIP.Format("%d

c++-请教一个VC++SOCKET的问题

问题描述 请教一个VC++SOCKET的问题 bind(ss, (SOCKADDR*)&ddd, sizeof(ss)); 请问下这句话中的,第二个参数为什么要加取地址呀?难道SOCKADDR*不足以把 ddd转换成指针吗?还要加个取地址,好像别的地方的用法都不用加取地址符 解决方案 建议参考官方资料.https://msdn.microsoft.com/en-us/library/ms737550 解决方案二: 进行类型转换,符合函数调用的参数.bind的第二个参数有类型要求.你需要对应的转换

c++-请教一个SOCKET套接字的问题

问题描述 请教一个SOCKET套接字的问题 int socket(int domain, int type, int protocol); 请问下上面这句话 我看到有的人写的时候用的 不是INT类型 而是 SOCKET SS=socket....... 请问下INT和 SOCKET能一样么?我试过 结果是一样的,但是不太明白所以来请教一下各位. 解决方案 SOCKET应该就是一个socket句柄类型,而windows下各种句柄都是dword型的数所以用int也一样,你可以转到SOCKET的定义看