首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

请问一上C#的Socket开发TCP通讯,编写的客户端连接服务端,如果服务端没有打开客户端就出现假死的现象

2012-08-14 
请教一下C#的Socket开发TCP通讯,编写的客户端连接服务端,如果服务端没有打开客户端就出现假死的现象。在书

请教一下C#的Socket开发TCP通讯,编写的客户端连接服务端,如果服务端没有打开客户端就出现假死的现象。
在书本上看到可以使用异步通讯的方法,但是在网上早了很多个源代码都出现假死现象。有这方面经验的请提供下。

[解决办法]
两个线程..死一个
[解决办法]
一定两个死一个
设置timeout吧

C# code
using System;using System.Net.Sockets;using System.Threading;/// <summary>/// TcpClientWithTimeout is used to open a TcpClient connection, with a/// user definable connection timeout in milliseconds (1000=1second)/// Use it like this:/// TcpClient connection = new TcpClientWithTimeout('127.0.0.1',80,1000).Connect();/// </summary>public class TcpClientWithTimeout{  protected string _hostname;  protected int _port;  protected int _timeout_milliseconds;  protected TcpClient connection;  protected bool connected;  protected Exception exception;  public TcpClientWithTimeout(string hostname,int port,int timeout_milliseconds)  {    _hostname = hostname;    _port = port;    _timeout_milliseconds = timeout_milliseconds;  }  public TcpClient Connect()  {    // kick off the thread that tries to connect    connected = false;    exception = null;    Thread thread = new Thread(new ThreadStart(BeginConnect));    thread.IsBackground = true; // So that a failed connection attempt    // wont prevent the process from terminating while it does the long timeout    thread.Start();    // wait for either the timeout or the thread to finish    thread.Join(_timeout_milliseconds);    if (connected == true)    {      // it succeeded, so return the connection      thread.Abort();      return connection;    }    if (exception != null)    {      // it crashed, so return the exception to the caller      thread.Abort();      throw exception;    }    else    {      // if it gets here, it timed out, so abort the thread and throw an exception      thread.Abort();      string message = string.Format("TcpClient connection to {0}:{1} timed out",        _hostname, _port);      throw new TimeoutException(message);    }  }  protected void BeginConnect()  {    try    {      connection = new TcpClient(_hostname, _port);      // record that it succeeded, for the main thread to return to the caller      connected = true;    }    catch (Exception ex)    {      // record the exception for the main thread to re-throw back to the calling code      exception = ex;    }  }}And here's a little example of how to use this to open a connection, send 10 bytes, and receive 10 bytes:// connect with a 5 second timeout on the connectionTcpClient connection = new TcpClientWithTimeout("www.google.com", 80, 5000).Connect();NetworkStream stream = connection.GetStream();// Send 10 bytesbyte[] to_send = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xa};stream.Write(to_send, 0, to_send.Length); // Receive 10 bytesbyte[] readbuf = new byte[10]; // you must allocate space firststream.ReadTimeout = 10000; // 10 second timeout on the readstream.Read(readbuf, 0, 10); // read// Disconnect nicelystream.Close(); // workaround for a .net bug: http://support.microsoft.com/kb/821625connection.Close(); 

热点排行