Tag: tcp

TCP重置后随机“远程主机强制关闭现有连接。”

我有两个部分,一个客户端和一个服务器。 我尝试从客户端向服务器发送数据(大小> 5840字节),然后服务器将数据发回。 我循环这次,每次等待一秒钟。 有时服务器应用程序崩溃,崩溃似乎非常随机的错误: 未处理的exception:System.IO.IOException:无法从传输连接读取数据:远程主机强制关闭现有连接。 —> System.Net.Sockets.SocketException:远程主机强制关闭现有连接 在System.Net.Sockets.Socket.Receive(Byte []缓冲区,Int32偏移量,Int32大小,SocketFlags socketFlags) 在System.Net.Sockets.NetworkStream.Read(Byte []缓冲区,Int32偏移量,Int32 siz) —内部exception堆栈跟踪结束— 在System.Net.Sockets.NetworkStream.Read(Byte []缓冲区,Int32偏移量,Int32 siz) at TCP_Server.Program.Main(String [] args) 客户端代码(这在循环内): try { Int32 port = 13777; using (TcpClient client = new TcpClient(ip, port)) using (NetworkStream stream = client.GetStream()) { client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true); var data = GenerateData(size); sw.Start(); // Send the message to […]

Windows 8 – .NET TCP AcceptAsync回调未触发(由Console.ReadLine()阻止)

我遇到了Windows 8和VS2012特有的问题。 我有一个TCP套接字服务器和客户端,我正在本地网络上进行一些测试。 使用sysinternals TCPView,我可以看到数据包是从TCP客户端发送到达TCP服务器的(我看到数据包计数器增加)。 但是,好像数据没有进入应用程序堆栈? 在Windows 7上,完全相同的构建运行没有问题。 我关闭了Windows 8防火墙,并在关闭UAC的域管理员用户上使用提升的权限运行这两个进程。 当我将客户端连接到外部服务器(在单独的机器上运行)时,一切正常。 Windows 8中是否还有其他可以禁止本地进程之间的TCP数据通信的内容? 谢谢, 编辑 为了确保我的服务器应用程序中没有任何内容导致此问题,我在控制台应用程序中构建了一个快速TCP服务器,其中包含以下用于套接字构造函数的代码: listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 并在与我的服务器应用程序相同的本地IP /端口上侦听。 我遇到了同样的问题,我可以telnet到端口但是listenerSocket.AcceptAsync永远不会被击中。 编辑2 在进一步测试时,我认为我的问题与使用Async套接字调用有关,即如果我使用像socket.Accept()这样的同步调用,则测试应用程序正常运行。 但是,当我使用异步套接字调用,即socket.AcceptAsync()时,我遇到了提到的问题。 到目前为止,我找不到关于异步套接字调用的win7和8之间的差异。 这是我的快速示例应用程序,它显示异步回调从未被触发。 此代码段在Windows 7中正常工作,但在Windows 8中不起作用(尝试telnet到127.0.0.1:7000)。 class Program { private static SocketAsyncEventArgs socketAsyncEventArgs = new SocketAsyncEventArgs(); static void Main(string[] args) { var listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); […]

Networkcomms.net库发送自定义类

几天前我开始在C#中使用这个库 。 当我遇到错误时,我试图发送自定义类,这是我的代码: Main.cs private void button3_Click(object sender, EventArgs e) { listBox1.Items.Add(“Sending message to server saying ‘” + textBox2.Text + “‘”); TCPConnection connection = TCPConnection.GetConnection(new ConnectionInfo(serverIP, serverPort)); SendReceiveOptions options = connection.ConnectionDefaultSendReceiveOptions.Clone() as SendReceiveOptions; options.DataProcessors.Add(DPSManager.GetDataProcessor()); RijndaelPSKEncrypter.AddPasswordToOptions(options.Options, “Your strong PSK”); if (connection.SendReceiveObject(“Payload”, “Ack”, 1000, new PayloadFile(textBox2.Text)) != null) // <– Giving an exception here, "Type is not […]

聊天服务申请

我正在为游戏做聊天服务, 我正在使用TCP侦听器客户端来获取帐户信息,某种登录服务。 我想知道我是否可以保持连接到服务器的客户端,以检查他是否还在线,并且如果他有新消息则继续向他发送消息。 我已经尝试为登录队列创建一个套接字列表,但是一旦我接受了一个新套接字,它就会将前一个套接字断开连接到服务器。 byte[] usernameByte = new byte[100]; int usernameRecieved = s.Receive(usernameByte); //guiController.setText(System.DateTime.Now + ” Recieved Login…”); byte[] passByte = new byte[100]; int passRecieved = s.Receive(passByte); //guiController.setText(System.DateTime.Now + ” Recieved Password…”); string username = “”; string password = “”; for (int i = 0; i < usernameRecieved; i++) username += (Convert.ToChar(usernameByte[i])); for (int i […]

TcpListener:监听每个地址,包括GPRS IP地址

我们有一个简单的遗留软件,我们需要通过端口15001使用TCP / IP进行通信。我们需要在端口15001上侦听遗留软件以建立连接,然后读取它发送给我们的任何内容。 我们已经在互联网上测试了这个解决方案,它运行得很好。 但是,如果我们通过GPRS TCP / IP网络测试相同的解决方案,则不会。 已经检查了所有基础知识,我们可以ping通GPRS网络中的其他设备,并且端口15001不会被任何防火墙阻止。 那么我的TcpListener可能有问题吗? 它初始化如下: tcpServer = new TcpListener(IPAddress.Any, TCP_PORT); 我假设它监听系统上每个可用的IPv4接口,因为我使用了IPAddress.Any? 有没有人知道这两个网络之间的区别是什么? (即使没有任何区别)如果有什么我需要更改为我的TcpListener?

使用C#的原始套接字

我想在C#中编写一个端口扫描程序,我不能使用SocketType.Raw,因为原始套接字是从桌面版本的Windows中取出的。 我不能使用SharpPcap或Winpcap的其他包装器,因为我使用PPPoE进行互联网连接,而Winpcap不支持PPP设备。 我需要使用一个实现原始套接字的库,而不依赖于winpcap。 有任何想法吗? 基本上我需要发送SYN,接收SYN / ACK或RST但不发送ACK。 编辑: 对于那些不相信RAW套接字从Windows桌面版本中消失的人,请看这里: http : //msdn.microsoft.com/en-us/library/windows/desktop/ms740548(v = vs。85).aspx 在Windows 7,Windows Vista,Windows XP Service Pack 2(SP2)和Windows XP Service Pack 3(SP3)上,通过原始套接字发送流量的能力受到以下几种限制: TCP数据无法通过原始套接字发送。 无法通过原始套接字发送具有无效源地址的UDP数据报。 任何传出UDP数据报的IP源地址必须存在于网络接口上,否则数据报将被丢弃。 此更改旨在限制恶意代码创建分布式拒绝服务攻击的能力,并限制发送欺骗数据包(具有伪造源IP地址的TCP / IP数据包)的能力。 不允许使用IPPROTO_TCP协议的原始套接字调用bindfunction。 注意其他协议(例如IPPROTO_IP , IPPROTO_UDP或IPPROTO_SCTP )允许使用带原始套接字的bindfunction。

通常只允许使用每个套接字地址(协议/网络地址/端口)?

我一直在谷歌寻找一个严肃的解决方案,我只得到“Regisrty解决方案”的东西,我不认为甚至与我的问题有关。 由于某种原因,我得到这个错误,而我只启动一次TcpListner,当+如果失败我停止服务器。 我真的不明白。 这是我的代码: class Program { private static string ServerName = “”; private static string UserName = “”; private static string Password = “”; private static string dbConnectionSring = “”; private static X509Certificate adminCertificate; private static byte[] readBuffer = new byte[4096]; static void Main(string[] args) { Console.WriteLine(“Please grant SQL Server access to the Admin […]

C#通过socket发送结构对象

我在c#中用客户端/服务器编程做了一些阅读。 我对这个过程非常熟悉,可以提出以下问题: 我如何通过TCP / IP而不是字符串传输结构对象? 我的应用程序是一个具有聊天function的联网游戏。 所以我不想只传输文本,而是想要构建一个包含两个字段的数据结构或类结构:i。 包类型ii。 数据包类型的数据 我会在应用程序执行期间需要时传输它,并在接收端解码数据对象并将其放在它所属的位置。 我不寻找代码,只是一些想法和搜索语句,我可以提供给谷歌,所以我会; 有一个更好的理解。 香港专业教育学院阅读有关序列化/反序列化,是他的方式去? 谢谢。 我已经检查了相关主题的post,但仍然希望进一步指导。

C#Socket.Receive消息长度

我目前正在开发一个可以接受来自多个客户端计算机的多个连接的C#Socket服务器。 服务器的目标是允许客户端从服务器事件“订阅”和“取消订阅”。 到目前为止,我已经在这里采取了一个快乐的好看: http : //msdn.microsoft.com/en-us/library/5w7b7x5f( v = VS.100) .aspx和http://msdn.microsoft.com/ en-us / library / fx6588te.aspx的想法。 我发送的所有消息都是加密的,因此我接收了我希望发送的字符串消息,将其转换为byte []数组,然后在将消息长度预先挂起到数据之前加密数据并通过连接发送出去。 令我印象深刻的一件事是:在接收端,当收到消息的一半时,Socket.EndReceive()(或相关的回调)似乎可能会返回。 是否有一种简单的方法可以确保每条消息都“完整”并且一次只收到一条消息? 编辑:例如,我认为.NET / Windows套接字没有“包装”消息,以确保在一个Socket.Receive()调用中收到与Socket.Send()一起发送的单个消息? 或者是吗? 到目前为止我的实施: private void StartListening() { IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName()); IPEndPoint localEP = new IPEndPoint(ipHostInfo.AddressList[0], Constants.PortNumber); Socket listener = new Socket(localEP.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); listener.Bind(localEP); listener.Listen(10); while (true) { // Reset the event. this.listenAllDone.Reset(); […]

WAN上的TCP和UDP套接字服务器

我正在尝试创建一个兼容TCP和UDP的服务器和客户端。 服务器在LAN设置中运行良好,但在WAN上传输时不会收到UDP消息。 我相信这是因为用于发送数据的UDP套接字不会在NAT表中保留足够长的时间来返回任何信息。 有没有办法让UDP端口在路由器中保持打开状态(没有端口转发)或者使用与已连接的TCP连接相同的UDP端口? 提前致谢。