C Socket程式設計筆記

2021-08-26 14:23:08 字數 3341 閱讀 5253

c# socket程式設計筆記

2023年03月14日

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.開始動手敲~~**(簡單的**)

首先我們來寫個面向連線的

tcpserver

using system;

using system.net;

using system.net.sockets;

using system.text;

namespace tcpserver

console.writeline( " disconnected from " + clientip.address);

client.close();

newsock.close();}}

} tcpclient

using system;

using system.net;

using system.net.sockets;

using system.text;

namespace tcpclient

catch (socketexception e)

int recv = 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();}}

}下面在給出無連線的(實在是太懶了,下面這個是直接複製別人的)

udpserver

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.net;

using system.net.sockets;

namespace ******udpsrvr

: " , remote.tostring());

console.writeline(encoding.ascii.getbytes(system.text.encoding.default.getchars(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 )}}

}udpclient

using system;

using system.collections.generic;

using system.linq;

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, ref remote); // 從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來寫。

既然快寫完了,那我就再多

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中一切都是以檔案為單...