程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 異步Socket(1)

異步Socket(1)

編輯:關於C語言

在網絡通訊的編程中我們經常使用到Socket, 這種情況下我們往往需要長期的監聽某個端口, 以獲得相應的Socket, 然後再利用它進行相關操作.但是這樣的話, 主線程就會被阻塞.無法對其他時間做出相應.其實在.Net的Socket類中提供了對異步操作的支持.下面將介紹其基本原理, 以及利用它做的一個P2P的實現.

背景知識:

你需要了解有關Socket的基本知識, 以及Delegate的異步調用操作.

在這個例子中, 我們實現了一個利用非阻塞(non-blocking)的Socket進行局域網通訊的P2P應用.每個客戶擁有一個Grid(類似於一個二維數組), 當它啟動Grid設置服務的時候,一旦別的客戶與它相連就可以查詢並修改某個網格中的數值.(比如查詢 grid[1][2]的值).

運行步驟:

1.啟動服務 在某個客戶端輸入 start 400 (400是端口號, 你可以任意指定)

2.連接其他Peer 在另一個客戶端中輸入 connect 202.119.9.12 400 (202.119.9.12 400是某個開啟服務的客戶端的IP地址)

3.輸入 get 1 1 表示你想獲得grid[1][1]這個網格中的數值.默認情況下得到0

4.輸入 set 1 1 5 表示你想設置grid[1][1]這個網格中的數值為5 .

5.再次輸入 get 1 1 查詢到結果為已修改的5

6.輸入shutdown 關閉與剛才與當前的Peer的連接.你可以再次連接別的Peer

運行示意圖.

 

在通常的應用中Server往往需要長期處於監聽狀態, 以等待ClIEnt的連接.下面是一個典型的應用.

private Socket clIEnt = null;
const int nPortListen = 399;
try
{
TcpListener listener = new TcpListener( nPortListen );
Console.WriteLine( "Listening as {0}", listener.LocalEndpoint );
listener.Start();
do
{
byte [] m_byBuff = new byte[127];
if( listener.Pending() )
{
clIEnt = listener.AcceptSocket();
// Get current date and time.
DateTime now = DateTime.Now;
string strDateLine = "Welcome " + now.ToString("G") + "nr";
// Convert to byte array and send.
Byte[] byteDateLine = System.Text.Encoding.ASCII.GetBytes( strDateLine.ToCharArray() );
clIEnt.Send( byteDateLine, byteDateLine.Length, 0 );
}
else
{
Thread.Sleep( 100 );
}
} while( true ); // Don't use this.
}
catch( Exception ex )
{
Console.WriteLine ( ex.Message );
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved