C Socket程式設計筆記

2021-09-07 10:57:15 字數 3279 閱讀 6561

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)

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

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

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