Tag: 套接字

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(); […]

关闭所有底层网络连接

背景: 我有一些代码连接到服务器来提取数据。 但是,在某些时候程序进入了无法连接到服务器的状态。 我们看到的问题是,当我们尝试重新连接时,服务器不断超时。 插入: 我们将超时设置为我们的网络插件(Thrift插件)使用的默认值。 这些值是100k毫秒超时和300k毫秒读写超时。 不完全是短暂的超时。 此外,每次我们尝试重新连接时,我们都会重新创建插件的类,因此每当我们尝试重新连接时,内部设置的值都会重置。 我认为超时不是问题。 我相信插件不是问题。 网络: 我们看到这些重复的超时发生了半个小时。 当我们重新启动服务(而不是机器)时,它立即重新上线。 所以,我知道这不是一个网络问题。 这让我相信我们的代码中的东西正在进入无效的网络状态。 此外,它是一个我们无法控制的状态,因为我们的插件隐藏了我们所有好的网络内容 – 包括超时,保持标记和连接组(以及其他)。 我们基本上无法访问HTTPWebReqest成员。 题: 当我们的网络设置进入此状态时,我们会尝试关闭所有连接并重新连接到服务器。 目标是杀死所有活动连接,以便重置我们进入的任何状态。 但是,当我们尝试重新连接时,我们的重新连接会超时。 不知何故(可能是由于KeepAlive和TCP Pipelining,我们无法控制),即使我们已关闭所有连接,网络连接仍保持打开状态。 这使我们处于不良状态并阻止我们将连接循环到服务器。 问题是: 我如何杀死服务器的所有底层连接以强制重新连接?

C#Networkstream.read()

read(缓冲区,偏移量,长度)如何实际工作,如果我将长度读取为32,这是否意味着它会一直阻塞直到它收到32个字节? 我知道它会返回和exception,或者在套接字exception或连接关闭时分别为0。 如果发送方只发送31个字节,会读取继续阻塞吗? 如果这是真的,是否意味着read总是返回等于传递给它的长度的整数? 以及如果剩余的1个字节在一定时间后没有出现,我如何控制超时。 重要但尚未回答 相反,如果发送方发送32字节,那么确保读取将阻塞直到接收到所有32个字节,或者它可以在不读取所有32个字节的情况下发出。

C#获取系统上Socket.ReceiveBufferSize和Socket.SendBufferSize的最大值

我们的高吞吐量应用程序(~1gbps)从大型ReceiveBufferSize和SendBufferSize中获益匪浅。 我注意到在我的机器上我可以有100 MB的缓冲区大小没有问题,但在某些客户端和测试机器上,最大值略大于10 MB并且似乎是可变的。 是否有任何方法可以查询系统max tx / rx缓冲区大小。

如何判断Socket何时断开连接

在客户端,我需要知道什么时候/我的套接字连接是否已被破坏。 但是,即使服务器端已断开连接并且我已尝试通过它发送数据,Socket.Connected属性也始终返回true。 任何人都可以帮我弄清楚这里发生了什么。 我需要知道套接字何时断开连接。 Socket serverSocket = null; TcpListener listener = new TcpListener(1530); listener.Start(); listener.BeginAcceptSocket(new AsyncCallback(delegate(IAsyncResult result) { Debug.WriteLine(“ACCEPTING SOCKET CONNECTION”); TcpListener currentListener = (TcpListener)result.AsyncState; serverSocket = currentListener.EndAcceptSocket(result); }), listener); Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Debug.WriteLine(“client socket connected: ” + clientSocket.Connected);//should be FALSE, and it is clientSocket.Connect(“localhost”, 1530); Debug.WriteLine(“client socket connected: ” + […]

“连接尝试失败,因为连接方在一段时间后没有正确响应”使用WebClient

我正在使用以下代码在本地机器上工作,但当我在服务器上尝试相同的代码时,它会抛出我的错误 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应 这是我的代码: WebClient client = new WebClient(); // Add a user agent header in case the // requested URI contains a query. //client.Headers.Add (“ID”, “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)”); Stream data = client.OpenRead(“http://” + Request.ServerVariables[“HTTP_HOST”] + Request.ApplicationPath + “/PageDetails.aspx?ModuleID=” + ID); StreamReader reader = new StreamReader(data); string s = […]

从C#客户端向Java服务器发送4字节消息头

我正在尝试将C#客户端编写到用Java编写的服务器上。 服务器需要一个4字节(Java中的DataInputStread readInt())消息头,后跟实际消息。 我是C#的新手,如何将此消息头发送到Java Server? 我尝试了几种方法(主要是试验和错误,而没有深入研究C#语言),没有任何效果。 Java端最终得到了不正确的(非常大的)消息长度。

异步递归在C#(async ctp / .net 4.5)中是否安全?

在C#with async ctp或vs.net 2011 beta中,我们可以编写这样的递归代码: public async void AwaitSocket() { var socket = await this.AcceptSocketAsync(); //await socket and >>return<< to caller AwaitSocket(); //recurse, note that the stack will never be deeper than 1 step since await returns.. Handle(socket); // this will get called since "await" returns } 在此特定示例中,代码异步等待tcp套接字,一旦被接受,它将递归并且异步等待另一个。 这似乎工作正常,因为await部分将使代码返回到调用者,因此,不会导致堆栈溢出。 这里有两个问题: 如果我们忽略了我们在这个样本中处理套接字的事实。 以这种方式进行堆栈自由递归是否可以? 还是有缺点我不见了? 从IO的角度来看,上面的代码是否足以处理所有传入的请求? 我的意思是只是等待一个,一旦它被接受开始等待另一个。 […]

直接在Socket上使用TcpClient有什么好处?

我知道TcpClient是套接字类的包装器,如果使用TcpClient,我可以访问底层套接字,但是包装器究竟做了什么? 使用TCPClient时,我是否需要继续调用Receive(),就像使用套接字一样,或者包装器是否确保显示所有数据? 最后,我可以在服务器和客户端上使用TcpClient来包装套接字(在使用TcpListener接受服务器上的原始连接之后)

NetworkStream.Write与Socket.Send

我有一个ac#应用程序,我使用自定义FTP库。 现在我使用Socket.Send发送数据,但我想知道用套接字启动NetworkStream是否更好,而是使用NetworkStream.Write。 使用一个优于另一个是否有任何优势?