C Socket程式設計筆記

2021-07-04 05:51:30 字數 3832 閱讀 6178

注意:如果你已經接觸過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中一切都是以檔案為單...