Tag: 网络

TCP / IP消息帧

我已经建立了一个TCP / IP服务器/客户端,它是异步的,但它连接了消息。 我如何正确地在开始时添加标题,然后在最后使用字符串构建器来取消连接完整的消息。 服务器阅读消息: Private Sub ReadCallback(ByVal result As IAsyncResult) Try allDone.Set() Dim success As Boolean = result.AsyncWaitHandle.WaitOne(500, True) If success Then Dim client As ServerClient = TryCast(result.AsyncState, ServerClient) If client Is Nothing Then Return End If Dim networkStream As NetworkStream = client.NetworkStream Dim read As Integer = networkStream.EndRead(result) If read = 0 Then […]

发布/订阅架构

我尝试编写一个pub / sub系统(客户端和服务器端),其中客户端接收定期更新(如心跳,消息控制),并可以向服务器发出命令(订阅某些源,….)。 这样做有什么好办法? 我已经有一个实现线程池的服务器来管理传入的客户端连接。 我想知道如何处理连接的两端可以在NetworkStream中读取或写入数据的事实。 此外,我的更多客户实际上会向服务器发出很少的命令(主要是订阅一些数据,然后只是定期更新)。 我尝试使用普通套接字,tcpclient,tcplistner(我稍后会看到WCF) Thx Dave

你如何获得主机的主要IP地址?

调用以下内容可以返回所有IP地址的列表。 Dns.GetHostAddresses(Dns.GetHostName()) 有时,根据机器配置,这可能会为您提供多个IP。 所以问题是,您如何确定哪个是主IP地址? 你是否枚举了网卡?

枚举所有打开的连接

是否可以使用.NET枚举当前进程的所有打开连接? (类似于netstat工具执行此操作的方式)

无法处理从HTTP / HTTPS协议重定向到其他不同的协议

基本上,我正试图从CNet的Download.com上获取EXE 所以我创建了Web解析器,到目前为止一切顺利。 以下是从其网站直接提取的示例链接: http://dw.com.com/redir?edId=3&siteId=4&oId=3001-20_4-10308491&ontId=20_4&spi=e6323e8d83a8b4374d43d519f1bd6757&lop=txt&tag=idl2&pid=10566981&mfgId=6250549&merId=6250549&pguid=PlvcGQoPjAEAAH5rQL0AAABv&destUrl=ftp%3A%2F%2F202.190.201.108%2Fpub%2Fryl2%2Fclient%2Finstaller-ryl2_v1673.exe 问题出在这里:当您尝试下载时,它以HTTP开头,然后重定向到FTP站点。 我已经尝试过.NET的WebClient和HttpWebRequest对象,看起来两者都不能支持重定向。 此代码在GetResponse()时失败; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(“http://dw.com.com/redir”); WebResponse response = req.GetResponse(); 现在,我也试过这个: HttpWebRequest req = (HttpWebRequest)WebRequest.Create(“http://dw.com.com/redir”); req.AllowAutoRedirect = false; WebResponse response = req.GetResponse(); string s = new StreamReader(response.GetResponseStream()).ReadToEnd(); 并且它不再抛出错误,但变量s变成空字符串。 我不知所措! 任何人都可以帮忙吗?

GetAllNetworkInterfaces()抛出exception

在Mono for Android中,我试图在本地网络中获取设备的所有IP地址。 我不介意环回,但我对调用DNS不感兴趣。 最好的方式似乎是打电话…… using System.Net.NetworkInformation; NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces(); …除了它抛出…… System.EntryPointNotFoundException:getifaddrs 有什么建议?

尝试连接到TCP套接字时出现无效的指针地址错误

我有以下.NET代码。 其中大部分都是在我被录用之前写的,而且最初的开发者都没有为我们工作。 private void SendTCPMessage(string IpAddress, string Message) { … //original code that fails because the Host entry produced //has no elements in AddressList. //IPHostEntry remoteMachineInfo = Dns.GetHostEntry(IpAddress); //New code that fails when connecting IPHostEntry remoteMachineInfo; try { remoteMachineInfo = Dns.GetHostEntry(IpAddress); if (remoteMachineInfo.AddressList.Length == 0) remoteMachineInfo.AddressList = new[] { new IPAddress( //Parse the string into […]

使用TCP时,是否需要使用校验和来保护我的消息?

使用TCP作为网络协议,在通过网络发送消息之前,我将每个消息的大小(以及可能的校验和?)加上前缀。 我想知道,计算和传输消息的校验和是否有意义,以确保消息将被传送(如果和何时传送)不变,例如由于某些网络错误。 目前我在发送消息之前发送消息的4字节大小+ 2字节校验和(CRC-16)。 另一个端点正确识别预期的消息长度,读取它并validation校验和。 我知道TCP有内部数据包validation机制,我有一种强烈的感觉,我在应用程序级别的消息validation是多余的,但我不确定,在做出决定之前需要你的建议。 我正在开发客户端 – 服务器应用程序,每天有数万个与服务器的潜在连接。 即使任何消息中的单个损坏字节也可能导致交换不正确消息的整个链,这是不可接受的(好吧,几乎所有客户端 – 服务器应用程序都有相同的要求,不是它们)。 所以我想确定 – 我能安全地信任TCP的内部可靠性,还是提供自己的校验和validation机制更好。 我说的是小的,两个字节的校验和(CRC-16),我不是在谈论数字签名消息等等(并且系统是使用套接字在.Net(C#)中开发的,如果这有任何区别的话) 。

Socket.BeginReceive合并TCP数据包

是否有一个设置我可以用来防止将多个TCP数据包合并到Socket.BeginReceive回调中的单个缓冲区? 你的下意识反应是我无法阻止TCP分裂/合并数据,但这不是我要求的 ; 我可以清楚地看到在Wireshark中收到的各个数据包,我唯一关心的是延迟,即一旦到达就处理该段。 这并不意味着我不知道如何处理拆分/合并段,但这意味着我想避免延迟。 我的代码如下所示: void WaitForData(ISocketInfo soc) { if (socket != null && socket.Connected) socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, OnPacketReceived, socket); } void OnPacketReceived(IAsyncResult asyn) { try { var socket = (ISocketInfo)asyn.AsyncState; numberOfBytesReceived = socket.EndReceive(asyn); if (numberOfBytesReceived > 0) { _queue.Enqueue(buffer, 0, numberOfBytesReceived); OnNewDataReceived(); } WaitForData(socketInfo); } catch (SocketException ex) { Log.Warn(“Socket error while […]

C#中的可靠多播

在c#/ .Net 3.5中我有哪些可靠的多播选项? 我不想使用MSMQ。 我对商业和开源选项持开放态度。 谢谢