Tag: 套接字

TcpClient的NetworkStream何时完成一次读操作?

我正在开发一个涉及通过TCP和Google协议缓冲区进行客户端服务器通信的项目。 在客户端,我基本上使用NetworkStream.Read()通过字节数组缓冲区从服务器进行阻塞读取。 根据MSDN文档, 此方法将数据读入buffer参数并返回成功读取的字节数。 如果没有可用于读取的数据,则Read方法返回0. Read操作读取尽可能多的数据,最多为size参数指定的字节数。 如果远程主机关闭连接,并且已收到所有可用数据,则Read方法立即完成并返回零字节。 与异步读取(NetworkStream.BeginRead和EndRead)的情况相同。 我的问题是Read()/ EndRead()何时返回? 看起来它会在填充缓冲区中的所有字节后返回。 但在我自己的测试中,情况并非如此。 在一次操作中读取的字节变化很大。 我认为这是有道理的,因为如果在发送消息时服务器端有暂停,客户端不应该等到读取缓冲区已经填满。 Read()/ EndRead()本身是否有一些超时机制? 我试图找出Mono如何在NetworkStream中实现Read()并跟踪,直到调用extern方法Receive_internal()。

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 […]

Image.FromStream使用networkStream

我正在尝试使用类Image的FromStream方法来设置使用网络流通过tcp连接接收的图像。 这里有双方代码: 服务器: TcpListener server = new TcpListener(IPAddress.Any, 34567); server.Start(); TcpClient client = server.AcceptTcpClient(); byte[] buffer = new byte[256]; int n = 0; Console.WriteLine(“{0}, {1}”, Encoding.ASCII.GetString(buffer, 0, n), client.Client.RemoteEndPoint); byte[] img = File.ReadAllBytes(@”C:\Users\Luca\Desktop\video grest\8599929-nessun-segnale.jpg”); client.Client.Send(img); 客户: TcpClient tcp = new TcpClient(“127.0.0.1”, 34567); NetworkStream stream = tcp.GetStream(); MessageBox.Show(“fatto”); pictureBox1.Image = Image.FromStream(stream); 问题是客户端程序在最后一条指令上停止并且它没有前进,如果关闭服务器(甚至30分钟后),它表示连接已关闭但是图片框没有显示任何内容……为什么? 提前致谢。

通过TCP发送和接收XML数据

我一直在试图弄清楚如何通过TCP服务器发送和接收XML数据。 我来自java编程背景,所以我有点超出我的深度。 如果我只发送纯文本,我的程序可以工作,但是一旦我尝试发送xml数据,它就会挂起。 服务器永远不会收到消息。 我一直在寻找代码来做到这一点,并没有找到任何运气,我已经看到许多在线的代码示例不起作用。 如果你们中的任何一个人能解决这个问题,我将非常感激。 我在这里寻找代码示例,而不是解释我应该做些什么来解决它。 我只编写了C#几天。 以下是XML请求示例。 AGENT GET_SYSTEM_INFO UMOHB 这是我的TCP客户端代码 public static void sendStringRequest(String hostname, int port, String message) { String response = String.Empty; TcpClient client = getConnection(hostname, port); Console.WriteLine(message); NetworkStream stream = client.GetStream(); StreamWriter writer = new StreamWriter(stream, Encoding.UTF8); writer.AutoFlush = false; writer.Write(Encoding.UTF8.GetBytes(message).Length); writer.Write(message); writer.Flush(); StreamReader reader = new StreamReader(stream, Encoding.UTF8); […]

C#Socket BeginReceive / EndReceive捕获多条消息

问题: 当我做这样的事情时: for (int i = 0; i < 100; i++) { SendMessage( sometSocket, i.ToString()); Thread.Sleep(250); // works with this, doesn't work without } 无论有没有睡眠,服务器都会记录发送单独的消息。 但是,如果没有睡眠,客户端最终会在单个OnDataReceived中接收多条消息,因此客户端将收到以下消息: 0,1,2,34,5,678,9 …… 服务器发送代码: private void SendMessage(Socket socket, string message) { logger.Info(“SendMessage: Preparing to send message:” + message); byte[] byteData = Encoding.ASCII.GetBytes(message); if (socket == null) return; if (!socket.Connected) return; […]

如何重复读取套接字?

首先,我在C#编码。 我通过套接字将不同大小的数据写入设备。 在写入我想要从套接字读取的数据之后,因为一旦完成处理所有数据,设备将回写错误代码/完成消息。 目前我有这样的事情: byte[] resultErrorCode = new byte[1]; resultErrorCode[0] = 255; while (resultErrorCode[0] == 255) { try { ReadFromSocket(ref resultErrorCode); } catch (Exception) { } } Console.WriteLine(ErrorList[resultErrorCode[0] – 48]); 我在其他地方使用ReadFromSocket ,所以我知道它工作正常。 最终发生的是我从(在我的机器上)连接的端口更改为随机端口。 我认为这会导致另一方的固件连接不良。 因此,当我在另一侧写入数据时,它会尝试将数据写入我连接的原始端口,但在尝试多次读取后,连接端口就会发生变化。 在收到完成命令之前,如何连续读取套接字? 如果我知道循环有问题,因为对于我最小的测试文件,它需要1分13秒非常一致。 我已经通过删除循环并将代码置于hibernate状态1分15秒来测试代码。 当它恢复时,它成功读取了我期待的完成命令。 有人有建议吗?

通过TCP套接字发送大量数据

这是我在这个论坛上发布的第一个问题,我是c#世界的初学者,所以这对我来说很有意思,但我面临着通过套接字发送大量数据的一些问题,所以这是更多细节关于我的问题: 我正在通过TCP套接字发送5 Mo的二进制映像,在接收部分我保存结果(接收数据)并且只获得1.5 Mo ==>数据已丢失(我比较了原始文件和生成的文件它向我展示了错过的部分)这是我使用的代码: private void senduimage_Click(object sender, EventArgs e) { if (!user.clientSocket_NewSocket.Connected) { Socket clientSocket_NewSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); user.clientSocket_NewSocket = clientSocket_NewSocket; System.IAsyncResult _NewSocket = user.clientSocket_NewSocket.BeginConnect(ip_address, NewSocket.Transceiver_TCP_Port, null, null); bool successNewSocket = _NewSocket.AsyncWaitHandle.WaitOne(2000, true); } byte[] outStream = System.Text.Encoding.ASCII.GetBytes(Uimage_Data); user.clientSocket_NewSocket.Send(outStream); } 在他们说要将数据分成块的论坛中,这是一个解决方案,如果是这样我怎么能这样做,我已经尝试但是它没有用!

枚举所有打开的连接

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

TCP套接字通信限制

TCP客户端可以接收的数据大小是否有限制。 使用TCP套接字通信,服务器正在发送更多数据,但客户端只获得4K并停止。

在AcceptSocket超时?

是否可以在TcpListener对象上使用超时的AcceptSocket ,以便TcpListener中断一次? TcpListener server = new TcpListener(localIP, port); server.Start(); while (!shuttingDown) try { Socket client = server.AcceptSocket(); if (client != null) { // do client stuff } } catch { } 尝试BeginAccept和EndAccept:如果3秒内没有客户端,我如何结束接受? (我试图在这里近似解决方案) server.BeginAcceptTcpClient(new AsyncCallback(DoAcceptTcpClientCallback), server); Thread.Sleep(3000); server.EndAcceptTcpClient(???);