在C#中使用TcpClient的或一般连接到插座我怎么能先检查如果某个端口是免费在我的机器上?
更多信息: 这是我使用的代码:
TcpClient c;
//I want to check here if port is free.
c = new TcpClient(ip, port);
Run Code Online (Sandbox Code Playgroud) 我有一个vb.net应用程序打开一个套接字并监听它.
我需要使用在浏览器上运行的javascript通过此套接字与该应用程序进行通信.那就是我需要在这个套接字上发送一些数据,以便正在监听这个套接字的应用程序可以获取该数据,使用一些远程调用做一些事情并获取更多数据并将其放回我的javascript需要的套接字上在浏览器中阅读并打印.
我试过,socket.io,websockify但没有一个被证明是有用的.
因此,问题是,我正在尝试甚至可能吗?有没有办法在浏览器中运行的javascript可以连接到tcp套接字并发送一些数据并在其上侦听以在套接字上获得更多数据响应并将其打印到浏览器.
如果可能的话,有人可以指出正确的方向,这将有助于我确定目标.
我有一个TcpClient,我用它来发送数据到远程计算机上的监听器.远程计算机有时会打开,有时会关闭.因此,TcpClient将无法经常连接.我希望TcpClient在一秒钟后超时,因此它无法连接到远程计算机时花费太多时间.目前,我将此代码用于TcpClient:
try
{
TcpClient client = new TcpClient("remotehost", this.Port);
client.SendTimeout = 1000;
Byte[] data = System.Text.Encoding.Unicode.GetBytes(this.Message);
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
data = new Byte[512];
Int32 bytes = stream.Read(data, 0, data.Length);
this.Response = System.Text.Encoding.Unicode.GetString(data, 0, bytes);
stream.Close();
client.Close();
FireSentEvent(); //Notifies of success
}
catch (Exception ex)
{
FireFailedEvent(ex); //Notifies of failure
}
Run Code Online (Sandbox Code Playgroud)
这对于处理任务非常有效.如果可以,它会发送它,如果它无法连接到远程计算机,则捕获异常.但是,当它无法连接时,抛出异常需要十到十五秒.我需要它在大约一秒钟内超时?我怎样才能改变超时时间?
我正在尝试通过遵循文档https://docs.microsoft.com/pl-pl/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-2017在Linux中设置ms-sql服务器
SQL服务器状态为活动(正在运行)
执行命令时出现以下错误
sqlcmd -S localhost -U SA -P '<YourPassword>'
Run Code Online (Sandbox Code Playgroud)
错误:
Sqlcmd:错误:SQL Server的Microsoft ODBC驱动程序17:TCP提供程序:错误代码0x2746。Sqlcmd:错误:SQL Server的Microsoft ODBC驱动程序17:客户端无法建立连接。
我也通过给出命令来尝试
sqlcmd -S 127.0.0.1 -U SA -P '<YourPassword>'
Run Code Online (Sandbox Code Playgroud)
但是问题没有解决,并且显示相同的错误。
当我尝试输入错误的密码时,它也会显示相同的错误。
请帮助我解决这个问题。提前致谢 !
我正在使用TcpClient在端口上侦听请求.当请求从客户端进来时,我想知道发出请求的客户端ip.
我试过了:
Console.WriteLine(tcpClient.Client.RemoteEndPoint.ToString());
Console.WriteLine(tcpClient.Client.LocalEndPoint.ToString());
var networkStream = tcpClient.GetStream();
var pi = networkStream.GetType().GetProperty("Socket", BindingFlags.NonPublic | BindingFlags.Instance);
var socketIp = ((Socket)pi.GetValue(networkStream, null)).RemoteEndPoint.ToString();
Console.WriteLine(socketIp);
Run Code Online (Sandbox Code Playgroud)
所有这些地址都输出10.xxx地址,这些地址是私有地址,显然不是我网络上发出请求的客户端的地址.如何获取发出请求的客户端的公共IP?
编辑: 我们正在使用带有tcp转发的Amazon EC2负载均衡器.有没有办法在这个设置中获得真正的客户端IP?
我需要开发一个连接到TCP服务器的服务.主要任务是读取传入消息,并在十分钟内将命令发送到服务器,如同步命令.例如,我使用了TcpClient对象,如下所示:
...
TcpClient tcpClient = new TcpClient();
tcpClient.Connect("x.x.x.x", 9999);
networkStream = tcpClient.GetStream();
clientStreamReader = new StreamReader(networkStream);
clientStreamWriter = new StreamWriter(networkStream);
while(true)
{
clientStreamReader.Read()
}
Run Code Online (Sandbox Code Playgroud)
此外,当我需要在任何方法中写出一些内容时,我使用:
clientStreamWriter.write("xxx");
Run Code Online (Sandbox Code Playgroud)
这种用法是否正确?或者,还有更好的方法?
我正在玩TcpClient,我试图弄清楚如何在连接断开时使Connected属性为false.
我试过了
NetworkStream ns = client.GetStream();
ns.Write(new byte[1], 0, 0);
Run Code Online (Sandbox Code Playgroud)
但是如果TcpClient断开连接,它仍然不会显示给我.你会如何使用TcpClient进行此操作?
花了更多的时间而不是合理地找到这个简单问题的答案,我想我会把结果留在这里,所以其他人不必跳过我刚刚遵循的所有箍和错误的路径.
问题是,如果您使用TcpClient ReadTimeout属性并且您的Read操作实际超时,Microsoft决定关闭套接字.这不是预期的,不可取的,不是我所知道的任何其他套接字实现所做的,并且没有正当理由认为除了程序员懒惰之外应该是这种情况.但这就是微软选择做的事情.
无论如何,我发现的所有变通方法,包括在这个网站上,都有各种方式进行某种形式的繁忙轮询,有些甚至涉及开始另一个线程来执行简单的读取呼叫.对不起,但是我的CPU有更好的事情,而不是坐在那里忙碌的民意调查,特别是打开很多套接字,所以这对我来说不是一个选择.毕竟,这不是1990年代早期的繁忙民意调查就是你做事的方式.如今,我们有一个称为操作系统的东西,可以使用中断非常有效地处理这些类型的事物.
无论如何,在另一个切向搜索中,我偶然发现了这篇旧帖子:
http://blogs.msdn.com/b/mflasko/archive/2006/02/20/535655.aspx
MSDN博客> Mike Flasko的博客>在读取网络数据时处理超时
关键消息告诉您如何正确处理读取超时的解决方案是:
此时,可能会尝试捕获异常,然后在同一NetworkStream上重新发出读取.此策略可能导致意外错误.最好的办法是将NetworkStream(套接字)视为处于不稳定状态.这是因为当底层堆栈超时时,底层I/O读取将被取消.如果数据同时进入,则数据将丢失,从而导致数据流损坏.
和解决方案:
更好的方法是捕获异常,关闭套接字或TCPClient并在必要时重新连接.
虽然我仍然认为这给API的用户带来了不必要的负担,但至少它是我能够找到的数十个网站中找到的最合适的解决方案,我试图找出一个半正确的套接字ReadTimeout.
我希望这个问题/评论可以节省一些人花在我身上的时间.
这不是另一个TcpClient vs Socket.
TcpClient是Socket类的一个包装器,用于简化开发,同时也暴露了底层的Socket.
还是......
在TcpClient类的MSDN库页面上,可以阅读以下注释:
TcpClient类提供了在同步阻塞模式下通过网络连接,发送和接收流数据的简单方法.
而对于Socket类:
Socket类允许您使用ProtocolType枚举中列出的任何通信协议执行同步和异步数据传输.
要仅通过TcpCient异步发送/接收某些数据,必须调用GetStream,通过在TAP模式上调用ReadAsync和WriteAsync方法,从中检索基础NetworkStream,可以异步读/写数据. (可能使用async/await构造).
要通过Socket异步发送/接收一些数据(我不是专家,但我认为我做对了),我们可以通过调用BeginRead/EndRead BeginWrite/EndWrite(或者只是ReadAsync或者)来直接读取/写入套接字实例本身. WriteAsync ..不暴露TAP模式 - 即不返回任务..令人困惑).
首先,任何想法为什么.NET 4.5中的Socket类没有以任何方式实现TAP模式,即ReadAsync和WriteAsync返回Task(如果调用不同的事件以保留向后compat)?
无论如何,很容易从APM模型方法对构建一个Task方法,所以让我说我调用这个异步方法(用于读取)ReadAsyncTAP(返回一个Task).
好 ?所以现在让我说我想编写一个客户端方法async Task<Byte[]> ReadNbBytes(int nbBytes),我将从我的代码调用异步从网络读取一定数量的字节.
完全基于TcpClient的此方法的实现将通过调用GetStream来获取NetworkStream,并且将包含等待ReadAsync调用的异步循环,直到缓冲区满.
基于Socket的这种方法的实现将包含一个等待ReadAsyncTAP的异步循环,直到缓冲区满.
在一天结束时,从客户端代码的角度来看,我认为它没有任何区别.在这两种情况下,呼叫await ReadNbBytes将立即"返回".但是,我认为它在幕后产生了影响......对于TcpClient,依赖于NetworkStream,与直接使用套接字相比,读取是否会以某种方式阻塞或不阻止?如果没有,那么在谈论同步阻塞模式时,TcpClient的注释是错误的吗?
如果有人能澄清,将非常感激!
谢谢.
我一直在努力解决这个问题,并且无法找到我的代码无法正确读取我已编写的TCP服务器的原因.我正在使用TcpClient类及其GetStream()方法,但有些东西没有按预期工作.操作块无限期(最后一次读取操作没有按预期超时),或者数据被裁剪(由于某种原因,读取操作返回0并退出循环,可能服务器响应速度不够快).这是实现此功能的三次尝试:
// this will break from the loop without getting the entire 4804 bytes from the server
string SendCmd(string cmd, string ip, int port)
{
var client = new TcpClient(ip, port);
var data = Encoding.GetEncoding(1252).GetBytes(cmd);
var stm = client.GetStream();
stm.Write(data, 0, data.Length);
byte[] resp = new byte[2048];
var memStream = new MemoryStream();
int bytes = stm.Read(resp, 0, resp.Length);
while (bytes > 0)
{
memStream.Write(resp, 0, bytes);
bytes = 0;
if (stm.DataAvailable)
bytes = stm.Read(resp, 0, resp.Length); …Run Code Online (Sandbox Code Playgroud) tcpclient ×10
c# ×8
.net ×4
sockets ×4
async-await ×1
asynchronous ×1
html5 ×1
javascript ×1
linux ×1
networking ×1
node.js ×1
sql-server ×1
tcp ×1
winforms ×1