Tag: 套接字

使用tcp套接字解析Windows Phone 7上的xml内容

我正在开发Windows Phone 7的应用程序。 我有一个使用c#silverlight中的tcp套接字来解析xml流。 我正在尝试使用xmlreader和内存流,但它没有任何帮助。 当通过接收异步调用更新内存流时,xmlreader对该读取器没有影响。 请帮我解决如何从套接字解析流式xml。 我有一个xmlReader,这样: memoryStream= new MemoryStream(); _xmlreader = XmlReader.Create(memoryStream, xmlReaderSettings, context); 现在memoryStream更新为: byte []buffer = “initialized with some xml bytes such as data ” 因为这个缓冲区是由套接字receiveasync操作填充的,它是xml。 现在我需要更新我的数据。 所以我这样做…… memoryStream = memoryStream.write(buffer,0,buffer.length); 现在,当我这样做_reader.read失败。 我不知道为什么会这样。 否则有xmlpullparser(sax)就像我们在android os中用于xml解析一样 while (_reader.Read()) { switch (_reader.NodeType) { case XmlNodeType.Element: { node = new XElement(_reader.Name); xmlBuildStack.Push(node); } break; […]

Socket单客户端/服务器连接,服务器可以多次发送,客户端只能发一次

我编写了一个客户端和服务器应用程序,我需要用它来连接我用C#制作的跳棋游戏。 我有连接的客户端和服务器,服务器可以重复发送客户端消息来更新标签但是当客户端尝试发送消息时它会抛出错误 “由于没有连接套接字而且(当使用sendto调用在数据报套接字上发送时)没有提供地址,因此不允许发送或接收数据的请求。” 到目前为止,这是我的客户端和服务器。 客户 – public partial class Form1 : Form //main form that establishes connection { Form2 form2 = new Form2(); Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Socket acc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint endPoint; static byte[] Buffer { get; set; } string text; public Form1() { InitializeComponent(); } private void […]

如何从服务器中的客户端池中识别客户端 – 设计

好的,我有一个我正在工作的客户端/服务器库。 服务器可以接受来自客户端的多个连接。 在每次调用Accept()时,如果成功,客户端套接字的句柄将被推送到地图,并将假定的唯一ID作为键。 因此,当服务器稍后想要向特定客户端发送消息时,它将使用此ID找到客户端。 我的问题:每个客户的唯一ID是什么? IP地址不可用,因为多个客户端可以来自同一IP地址。 如果没有,任何人都可以建议一些其他好的设计。 谢谢 插图: ClientSocket workerSock = Server.Accept(); Map.Add(workerSock); Map ____________________ |Key | Value | |——————| | ? |workerSock1| ———————— client application 1 |——————| | ? |workerSock2| ———————— client application 2 |——————| | ? |workerSock3| ———————— client application 3 ——————– 场景:服务器想要发送到特定客户端,因此它必须具有一些ID。

异步聊天服务器缓冲区问题

有人可以帮我解决这个问题……我一整天都在苦苦挣扎。 所以我正在尝试学习Async套接字,这是给我带来麻烦的东西。 问题基本上就是我与加入聊天室名称的人一起更新ListBox的方式: 基本上我正在做的是让每个客户端在加入服务器时发送“!! addlist [nickname]” 。 它并不理想,因为它不检查重复等,但现在我只想知道为什么它不起作用。 每当有人添加他们以前从未见过的名字时,他们也会发送“!! addlist [nick]” 这样,每次有人加入时,都应该为每个人更新列表。 问题似乎是所有客户端同时开始通信并且它会干扰缓冲区。 我已经尝试为每个客户端使用一个单独的缓冲区,所以这不是问题。 我尝试过使用lock(),但这似乎也没有用。 基本上发生的事情是缓冲区似乎被截断; 哪里有来自同一缓冲区中两个不同人的数据。 请告诉我我在缓冲区或客户端的错误: 请注意,异步套接字使用的是Send而不是BeginSend。 我已经尝试了两种方法,但它们遇到了同样的问题…所以它可能是客户端的? public partial class Login : Form { private ChatWindow cw; private Socket serverSocket; private List socketList; private byte[] buffer; private bool isHost; private bool isClosing; public void startListening() { try { this.isHost = true; //We’re […]

套接字性能C ++或C#

我必须编写一个基本上是代理服务器的应用程序来处理来自我们服务器的所有HTTP和HTTPS请求(Web浏览等)。 我对C ++知之甚少,并且很乐意在C#中编写应用程序function。 我已经尝试使用Mentalis (C#套接字代理)的代理,它似乎适用于小型网页,但如果我访问像tigerdirect.ca这样的大型网站并浏览几层,则速度非常慢,有时请求无法完成我看到破碎的图像和javascript错误。 所有供应商站点和其他内容繁重的站点都会发生这种情况。 Mentalis使用HTTP 1.0,我知道它不是那么有效但是代理应该那么慢吗? 使用代理可以承受的性能损失是多少? HTTP 1.1会有明显的区别吗? C ++代理会比C#中的代理快得多吗? Mentalis代码效率不高吗? 我是否能够使用预制的C ++代理并将DLL导入C#并仍然获得良好的性能,或者该项目是否会调用所有C ++? 很抱歉,如果这些是明显的问题,但我之前没有做过网络编程。 编辑回应Joshua的问题:我不一定需要自己编写核心代理服务器,只要有一个很好的实现,但就像我说我一直在试验Mentalis那样表现不佳。 最终的应用程序需要从单个安装程序安装在Windows PC / Server上,手动配置为0。 我可以在安装程序中编写所有必要的注册表编辑,就像我之前在C#中所做的那样。 更新我接受了Aaronaught的建议,并研究改进Mentalis的代码。 我修复了一个问题,因此它适用于HTTP 1.1,允许它与Chrome和Firefox一起使用(Windows上的Safari 4因某些原因导致代理崩溃)。 当我在FireFox和Chrome中测试时,我发现性能问题并不存在,这意味着IE问题不是代理问题。 重置浏览历史记录设置后,问题就消失了。 感谢大家!

套接字ReceiveAsync合并数据包

我打算通过套接字接收数据包,但由于它们是从发送方以高频率发送的,因此它们中的一些被打包成单个byte数组。 然后SocketAsyncEventArgs.Buffer保存多个数据包,即使它们是单独发送的(使用wiresharkvalidation)。 我已经尝试对传入的数据包进行排队并异步处理它们,但我仍然得到相同的结果。 这种行为可能是什么原因?

如何将IntPtr / Int转换为Socket?

我想将message.WParam转换为Socket。 protected override void WndProc(ref Message m) { if (m.Msg == Values.MESSAGE_ASYNC) { switch (m.LParam.ToInt32()) { case Values.FD_READ: WS2.Receive(m.WParam); case Values.FD_WRITE: break; default: break; } } else { base.WndProc(ref m); } } public class WS2 { public static void Receive(IntPtr sock) { Socket socket = sock; } } 如何将IntrPtr(sock)转换为Socket,以便我可以调用Receive()?

如何在C#中进行非阻塞套接字调用以确定连接状态?

Socket上的Connected属性的MSDN文档说明如下: Connected属性的值反映了最近操作时的连接状态。 如果需要确定连接的当前状态,请进行非阻塞,零字节发送调用。 如果调用成功返回或抛出WAEWOULDBLOCK错误代码(10035),则套接字仍然连接; 否则,套接字不再连接。 我需要确定连接的当前状态 – 如何进行非阻塞,零字节发送调用?

微软异步服务器套接字示例

我有一个关于这个问题的问题(“异步服务器套接字多个客户端”)。 要么微软改变了这个例子,因为Groos回答或者我真的没有得到它 – 在示例中它说: while (true) { // Set the event to nonsignaled state. allDone.Reset(); // Start an asynchronous socket to listen for connections. Console.WriteLine(“Waiting for a connection…”); listener.BeginAccept( new AsyncCallback(AcceptCallback), listener ); // Wait until a connection is made before continuing. allDone.WaitOne(); } 据我所知,在while(true)循环中连续调用BeginAccept()函数,只有在调用AcceptCallback()函数时才会被调用,因为首先发生的是allDone.Set()。 但格罗说 MSDN示例的问题在于它只允许连接单个客户端(listener.BeginAccept只调用一次)。 实际上我不明白为什么使用ManualResetEvent allDone …而且我认为listener.EndAccept(ar)方法无论如何都是阻塞的。 listener.BeginAccept()是否在仍然运行时第二次调用时抛出exception? 但是,如果是这样,为什么allDone.Set()在listener.EndAccept(ar)之前呢? 还有一个问题: 在收到EOF后,我可以在ReadCallback(IAsyncResult ar)函数中调用handler.BeginReceive(…)来等待来自同一客户端的更多数据吗? […]

蓝色屏幕导致C#程序?

这只是蓝屏显示的重要内容。 我在Windows 7 x64上。 “已检测到问题,Windows已关闭,以防止损坏您的计算机。 PROCESS_HAS_LOCKED_PAGES * STOP:0x00000076(0x0000000000000000,0xfffffa8009dcd060,0x0000000000000011,0x0000000000000000)“ 我现在无法工作,因为每次关闭它都会得到一个蓝屏! 除了运行下面的后台工作程序之外,该程序还没有做任何事情。 它ping所有可能属于用户家庭网络的地址,并尝试连接到另一个程序将侦听的某个端口。 private void NetworkScanner_DoWork(object sender, DoWorkEventArgs e) { bool ExceptionEncountered = false; int IPsProcessed = 0; NetworkSearcherOutput = “Starting network scanner…”; NetworkSearcher.ReportProgress(0); Thread.Sleep(1000); foreach (IPAddress IP in Dns.GetHostAddresses(Dns.GetHostName())) { if (IP.AddressFamily == AddressFamily.InterNetwork) { string[] Octets = IP.ToString().Split(‘.’); Octets[3] = “0”; IPAddress CurrentAddressIteration = StringArrayToIP(Octets); […]