C# tcp监听与连接问题

问题描述

我是像这样写的,但是遇到一个问题,就是我有一台电脑一方面要监听局域网的客户机,一方面还要连接公网(外网连接成功的),监听主要代码:privatevoidAcceptConnect(){intServerPoint=58888;IPAddress[]ip=Dns.GetHostAddresses(Dns.GetHostName());listener=newTcpListener(ip[0],ServerPoint);listener.Start();while(isExit==false){try{//让其他需要等待的线程阻塞//将事件的状态设为非终止allDone.Reset();//TcpClienttc=listener.AcceptTcpClient();//接受一个连接请求并返回TcpClient对象//NetworkStreamstm=tc.GetStream();//用GetStream方法创建NetworkStream对象//引用在异步操作完成时调用的回调方法AsyncCallbackcallback=newAsyncCallback(AcceptTcpClientCallback);//调用回调函数AcceptTcpClientCallback//listBoxStatus.Invoke(setListBoxCallback,"开始等待客户连接");//开始一个异步操作接受传入的连接尝试listener.BeginAcceptTcpClient(callback,listener);//接受一个传入连接allDone.WaitOne();//阻塞当前线程,直到收到信号}catch(Exceptionerr){//listBoxStatus.Invoke(setListBoxCallback,err.Message);break;}finally{}}}privatevoidAcceptTcpClientCallback(IAsyncResultar){try{//将事件状态设为终止状态,允许一个或多个等待线程继续//发送信号让阻塞的线程继续执行allDone.Set();//还原原始的TcpListener对象TcpListenermylistener=(TcpListener)ar.AsyncState;//异步接收传入的连接,并创建新的TcpClient对象处理远程主机通信TcpClientclient=mylistener.EndAcceptTcpClient(ar);//listBoxStatus.Invoke(setListBoxCallback,"已接受客户连接"+client.Client.RemoteEndPoint);//listBoxStatus.Items.Add("已接受客户连接"+client.Client.RemoteEndPoint);comboBox1.Invoke(setComboxItemsCallback,client.Client.RemoteEndPoint.ToString());//comboBox1.Items.Add(client.Client.RemoteEndPoint.ToString());IPEndPointclie=(IPEndPoint)client.Client.RemoteEndPoint;stringipc=clie.Address.ToString();//获取计算机名称computername=System.Net.Dns.Resolve(ipc).HostName;cbcomputer.Invoke(setComputerItemsCallback,computername);clientListcomputer.Add(computername);ReadWriteObjectreadWriteObject=newReadWriteObject(client);clientList.Add(readWriteObject);readWriteObject.netStream.BeginRead(readWriteObject.readByes,0,readWriteObject.readByes.Length,ReadCallback,readWriteObject);}catch(Exceptionerr){return;}finally{}}privatevoidReadCallback(IAsyncResultar){ReadWriteObjectreadWriteObject=(ReadWriteObject)ar.AsyncState;try{intcount=readWriteObject.netStream.EndRead(ar);richTextBoxReceive.Invoke(setRichTextBoxCallback,System.Text.Encoding.UTF8.GetString(readWriteObject.readByes,0,count));if(isExit==false){readWriteObject.InitReadArray();readWriteObject.netStream.BeginRead(readWriteObject.readByes,0,readWriteObject.readByes.Length,ReadCallback,readWriteObject);}}catch(Exceptionerr){comboBox1.Invoke(removeComboxItemCallback,readWriteObject);}}连接外网的主要代码:publicvoidconnecth(){if(Conn.State==ConnectionState.Open){clienthotel=newTcpClient(AddressFamily.InterNetwork);AsyncCallbackrequestCallbackh=newAsyncCallback(RequestCallbackh);allDone.Reset();clienthotel.BeginConnect("外网IP",51888,requestCallbackh,clienthotel);allDone.WaitOne();Conn.Close();}Conn.Close();}privatevoidRequestCallbackh(IAsyncResultar){allDone.Set();try{clienthotel=(TcpClient)ar.AsyncState;clienthotel.EndConnect(ar);//listBoxStatus.Invoke(setListBoxCallback,string.Format("与服务器{0}连接成功",client.Client.RemoteEndPoint));networkStreamh=clienthotel.GetStream();ReadObjectreadObject=newReadObject(networkStreamh,clienthotel.ReceiveBufferSize);networkStreamh.BeginRead(readObject.bytes,0,readObject.bytes.Length,ReadCallbackh,readObject);}catch(Exceptionerr){return;}finally{}}privatevoidReadCallbackh(IAsyncResultar){try{ReadObjectreadObject=(ReadObject)ar.AsyncState;intcount=readObject.netStream.EndRead(ar);richTextBoxReceiveh.Invoke(setRichTextBoxCallbackh,System.Text.Encoding.UTF8.GetString(readObject.bytes,0,count));if(isExit==false){readObject=newReadObject(networkStreamh,clienthotel.ReceiveBufferSize);networkStreamh.BeginRead(readObject.bytes,0,readObject.bytes.Length,ReadCallbackh,readObject);}}catch(Exceptionerr){}finally{}}这时候局域网的客户机就连接不到这台监听的机器了。但如果是没有连接到外网的时候,局域网的客户机可以连接到这台监听的机器???有人可以告诉我为什么吗?我用的是C#编写的。我想是连接和监听共同占用某个东西,可是我不知道是什么?希望大家知道的帮帮忙,O(∩_∩)O谢谢

解决方案

解决方案二:

解决方案三:
监听和连接不要用一个socket,把两者的端口号区分开

时间: 2024-09-17 06:40:06

C# tcp监听与连接问题的相关文章

activemq-C# 怎么监听ActiveMq连接异常?

问题描述 C# 怎么监听ActiveMq连接异常? 我想得到ActiveMq的登录用户列表,和离线信息,有没有办法,我在ActiveMq的bat运行服务器中看到了用户离线消息,我怎么通过ActiveMq的DLL监听他们的这些离线信息.我用IConnection中的ExceptionListener事件不好用,什么也接不到也不触发,不知道这兄弟是做什么的.

Android 利用广播监听usb连接状态(变化情况)

废话不多说了,直接给大家贴代码了,具体代码如下所示: package com.lgs.test.testcode.receiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.widget.Toast; /** * Create

tcp连接-TCP连接时,服务端监听socket接收客户端连接后新创建的socket默认绑定的端口是监听端口吗?

问题描述 TCP连接时,服务端监听socket接收客户端连接后新创建的socket默认绑定的端口是监听端口吗? 比如用来监听连接的socket绑定23端口,服务端每接受一个连接都新开一个线程和客户端通信,并把新socket传递给新线程,是不是所有新创建的socket都是经过23端口和客户端通信? 解决方案 是的,都通过端口23进行通信 解决方案二: 都是监听端口,如果不是客户端就不能将数据发送到服务器 解决方案三: 23只是监听建立连接,后续数据交换走实际上端口

NodeJS Web应用监听sock文件实例

 这篇文章主要介绍了NodeJS Web应用监听sock文件实例,本文讲解 NodeJS 的 TCP 和 HTTP 监听 Domain Socket 文件例子,需要的朋友可以参考下     像 NodeJS 写的 TCP 服务可以监听在某个 sock 文件(Domain Socket) 上,它的 HTTP 服务也能这么干.虽然作为 HTTP 服务连接某个 sock 文件的意义不大,所以这里只算是一个纯粹的尝试. TCP 服务是这样写 代码如下: var net = require('net');

NodeJS Web应用监听sock文件实例_node.js

像 NodeJS 写的 TCP 服务可以监听在某个 sock 文件(Domain Socket) 上,它的 HTTP 服务也能这么干.虽然作为 HTTP 服务连接某个 sock 文件的意义不大,所以这里只算是一个纯粹的尝试. TCP 服务是这样写 复制代码 代码如下: var net = require('net'); net.createServer(function (socket) {   socket.on('data', function (data) {     socket.wri

基于VC实现的网络监听功能程序实例_C 语言

本文所述VC++网络监听器代码,可以实现监听网络连接所使用的协议.源IP地址.目标IP地址等信息的功能,并且能把数据内容绑定到网格控件中显示.具体功能代码部分如下所示: //线程函数 UINT ThreadFun( LPVOID pParam ) { CSniffAppDlg* pDlg = static_cast<CSniffAppDlg*>(pParam); MSG msg; char buffer[1000],sourceip[32] ,*tempbuf; char *ptemp; BY

Oracle静态监听注册详解

网上有很多关于oracle 监听静态注册的文章,但大多都是简单说说,并没有详细的例子,这里,将结合linux as4 下的oracle 10gR2.0.1 举一个具体的例子 1.在 $ORACLE_HOME/network/admin/listener.ora 文件中加入一个静态注册的节点 [oracle@prudent oracle]$ cd $ORACLE_HOME/network/admin [oracle@prudent admin]$ vi listener.ora # listene

Oracle 静态监听注册详解

Oracle 静态监听注册详解        网上有很多关于oracle 监听静态注册的文章,但大多都是简单说说,并没有详细的例子,这里,将结合linux as4 下的oracle 10gR2.0.1 举一个具体的例子 1.在 $ORACLE_HOME/network/admin/listener.ora 文件中加入一个静态注册的节点 [oracle@prudent oracle]$ cd $ORACLE_HOME/network/admin [oracle@prudent admin]$ vi

Android 监听wifi广播的两种方式

 1.XML中声明 <receiver android:name=".NetworkConnectChangedReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.net.wifi.WIFI_STATE_CHANGED"