注意:如果你已經接觸過socket,那就沒什麼必要耽誤時間看下去了。另外,如果發現其中任何錯誤,歡迎直接指出。
1.按慣例先來介紹下socket
windows中的很多東西都是從unix領域借鑑過來的,socket也是一樣。在unix中,socket代表了一種檔案描述符(在unix中一切都是以檔案為單位),而這裡這個描述符則是用於描述網路訪問的。什麼意思呢?就是程式設計師可以通過socket來傳送和接收網路上的資料。你也可以理解成是乙個api。有了它,你就不用直接去操作網絡卡了,而是通過這個介面,這樣就省了很多複雜的操作。
在c#中,ms為我們提供了 system.net.sockets 命名空間,裡面包含了socket類。
2.有了socket,那就可以用它來訪問網路了
不過你不要高興得太早,要想訪問網路,還得有些基本的條件(和程式設計無關的我就不提了):a. 要確定本機的ip和埠,socket只有與某一ip和埠繫結,才能發揮強大的威力。b. 得有協議吧(否則誰認得你這傳送到網路的是什麼呀)。想要複雜的,我們可以自己來定協議。但是這個就不在這篇裡提了,我這裡介紹兩種大家最熟悉不過的協議:tcp & udp。(別說你不知道,不然...不然...我不告訴你)
如果具備了基本的條件,就可以開始用它們訪問網路了。來看看步驟吧:
a. 建立乙個套接字
b. 繫結本機的ip和埠
c. 如果是tcp,因為是面向連線的,所以要利用listeno()方法來監聽網路上是否有人給自己發東西;如果是udp,因為是無連線的,所以來者不拒。
d. tcp情況下,如果監聽到乙個連線,就可以使用accept來接收這個連線,然後就可以利用send/receive來執行操作了。而udp,則不需要accept, 直接使用sendto/receivefrom來執行操作。(看清楚哦,和tcp的執行方法有區別,因為udp不需要建立連線,所以在傳送前並不知道對方的ip和埠,因此需要指定乙個傳送的節點才能進行正常的傳送和接收)
e. 如果你不想繼續傳送和接收了,就不要浪費資源了。能close的就close吧。
如果看了上面文字,你還不清楚的話,就來看看圖好了:
面向連線的套接字系統呼叫時序
無連線的套接字系統呼叫時序
3.開始動手敲~~**(簡單的**)
首先我們來寫個面向連線的
using
system;
using
system.net;
using
system.net.sockets;
using
system.text;
namespace
tcpserver
console.writeline(
"disconnected from"+
clientip.address);
client.close();
newsock.close();}}
}using
system;
using
system.net;
using
system.net.sockets;
using
system.text;
namespace
tcpclient
catch
(socketexception e)
intrecv
=newclient.receive(data);
string
stringdata
=encoding.ascii.getstring(data,
0,recv);
console.writeline(stringdata);
while
(true
)console.writeline(
"disconnect from sercer
newclient.shutdown(socketshutdown.both);
newclient.close();}}
} 下面在給出無連線的(實在是太懶了,下面這個是直接複製別人的)
using
system;
using
system.collections.generic;
using
system.text;
using
system.net;
using
system.net.sockets;
namespace
******udpsrvr:"
, remote.tostring());
console.writeline(encoding.ascii.getbytes(data,
0,recv));
string
welcome ="
welcome to my test server!";
data
=encoding.ascii.getbytes(welcome);
newsock.sendto(data, data.length, socketflags.none, remote);
while
(true)}
}}using
system;
using
system.collections.generic;
using
system.text;
using
system.net;
using
system.net.sockets;
namespace
******udpclient:"
, remote.tostring());
console.writeline(encoding.ascii.getstring(data,
0, recv));
while
(true)//
讀取資料
server.sendto(encoding.ascii.getbytes(input), remote);
//將資料傳送到指定的終結點remote
data
=new
byte
[1024
];recv
=server.receivefrom(data,
refremote);
//從remote接受資料
stringdata
=encoding.ascii.getstring(data,
0, recv);
console.writeline(stringdata);
}console.writeline(
"stopping client");
server.close();}}
}
上面的示例只是簡單的應用了socket來實現通訊,你也可以實現非同步socket、ip組播 等等。
ms還為我們提供了幾個助手類:tcpclient類、tcplistener類、udpclient類。這幾個類簡化了一些操作,所以你也可以利用這幾類來寫上面的**,但我個人還是比較習慣直接用socket來寫。
既然快寫完了,那我就再多囉嗦幾句。在需要即時響應的軟體中,我個人更傾向使用udp來實現通訊,因為相比tcp來說,udp占用更少的資源,且響應速度快,延時低。至於udp的可靠性,則可以通過在應用層加以控制來滿足。當然如果可靠性要求高的環境下,還是建議使用tcp。
C Socket程式設計筆記
1.按慣例先來介紹下socket windows中的很多東西都是從unix領域借鑑過來的,socket也是一樣。在unix中,socket代表了一種檔案描述符 在unix中一切都是以檔案為單位 而這裡這個描述符則是用於描述網路訪問的。什麼意思呢?就是程式設計師可以通過socket來傳送和接收網路上的...
C Socket程式設計筆記
本文 1.按慣例先來介紹下socket windows中的很多東西都是從unix領域借鑑過來的,socket也是一樣。在unix中,socket代表了一種檔案描述符 在unix中一切都是以檔案為單位 而這裡這個描述符則是用於描述網路訪問的。什麼意思呢?就是程式設計師可以通過socket來傳送和接收網...
C Socket程式設計筆記
注意 如果你已經接觸過socket,那就沒什麼必要耽誤時間看下去了。另外,如果發現其中任何錯誤,歡迎直接指出。1.按慣例先來介紹下socket windows中的很多東西都是從unix領域借鑑過來的,socket也是一樣。在unix中,socket代表了一種檔案描述符 在unix中一切都是以檔案為單...