2013-03-14 2 views
0

Я хочу проверить доступные данные сокета, прежде чем я вызову метод receive(). Но это не работает. Я думаю, что я проверяю доступные данные в сокете. это код:Есть ли способ проверить данные, имеющиеся в соке, синхронно?

private Socket _clientSocket;    //Client socket 

    public Form1() 
    { 
     InitializeComponent(); 

     //Check for data available before calling Receive(). 
     if (_clientSocket.Poll(-1, SelectMode.SelectRead)) 
     { 
      Receive(); 
     } 


    } 

это дает мне эту ошибку: Object reference not set to an instance of an object

, что это правильный способ проверить сокет имеющиеся данные для чтения? Я думаю о каких-то событиях, но я не могу понять это.

любая помощь?

EDIT: Кнопка для подключения:

private void BtnConnect_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      string ip = TboxIP.Text; 
      int port = int.Parse(TboxPort.Text); 
      _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      // Connect to the host 
      _clientSocket.Connect(IPAddress.Parse(ip), port); 

      if (SocketConnected(_clientSocket) == true) 
      { 
       lblStatus.Text = "Socket Connection Established .. "; 
      } 


     } 
     catch (SocketException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
+0

Показать код, который инициализирует _clientSocket – Gary

+0

@Gary, я только что отредактировал. есть кнопка подключения, которая инициализирует _clientSocket. – Liban

ответ

2

Это ваши проблемы, вы обращаетесь к _clientSocket в конструкторе Form1 и еще не инициализирован.

+0

Наслаждайтесь новыми привилегиями SO @ 3000 rep. –

+1

, даже если я инициализирую его в Form1, программа ждет неопределенное количество времени, в то время как сокет не подключен. поэтому он блокирует весь поток пользовательского интерфейса. – Liban

+0

@ Liban, возможно, вам следует выполнить соединение на фоновом потоке – Gary

Смежные вопросы