C 套接字程式設計

2021-09-21 20:46:25 字數 3493 閱讀 8912

1.ipendpoint 

c#裡ip+埠對應的是ipendpoint:

先看下如何得到ipendpoint,其中乙個建構函式如下:

public ipendpoint( 

ipaddress address, 

int port 

) 這裡第乙個引數要求是個ipaddress型別的,先看看如果獲取ipaddress型別的物件,

其中ipaddress類有個靜態方法:

public static ipaddress parse( 

string ipstring 

) 比如ipaddress ia=ipaddress.parse("127.0.0.1");

這樣就可以如下:

ipaddress ia = ipaddress.parse("127.0.0.1");

ipendpoint ie = new ipendpoint(ia, 1234);

2.socket

建構函式

public socket( 

addressfamily addressfamily, 

sockettype sockettype, 

protocoltype protocoltype 

) 使用如  socket sck = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);

引數1位址家族:這裡是ip4

引數2套接字型別:流式套接字,面向連線的。

引數3協議型別:這裡tcp協議。

構造了socket物件之後,可以繫結乙個ipendpoint.

public void bind( 

endpoint localep 

)  繫結後就可以監聽了: sck.bind(ie);

public void listen( 

int backlog 

) sck.listen(10);

所以乙個服務端socket程式經過如下幾個步驟:

構建乙個socket物件===》繫結乙個ipendpoint===>監聽客戶端的連線===》accept接受客戶連線==》傳送資料==》關閉客戶端socket連線.!!!!!!!----------服務端socket關閉

完整服務端:

ipaddress 

ia= 

ipaddress

.parse("192.168.1.152"); 

ipendpoint ie

= new

ipendpoint(ia, 12345); 

socket sck

= new

socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp); 

sck.bind(ie); 

sck.listen(10); 

socket client

= sck

.accept(); 

client.close(); 

sck.close(); 

下面看看客戶端,服務端在監聽來自客戶端的連線,現在服務端就緒,我們客戶端去連線服務端:

socket有乙個connect方法:

public void connect( 

endpoint remoteep 

) 現在就是要與192.168.1.152:12345建立連線。

引數需要乙個endpoint物件,

ipaddress 

ia= 

ipaddress

.parse("192.168.1.152"); 

ipendpoint ie

= new

ipendpoint(ia, 12345); 

socket sck

= new

socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp); 

sck.connect(ie); 

與伺服器建立連線,成功了就可以交換資料了,還有個構造版本:

public void connect( 

ipaddress address, 

int port 

) 所以也可以這樣:

socket 

sck= 

newsocket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp); 

sck.connect(ipaddress.parse("192.168.1.152"), 12345); 

連線上就可以傳送接受資料了,這裡客戶端像服務端發個字串:

socket 

sck= 

newsocket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp); 

sck.connect(ipaddress.parse("192.168.1.152"), 12345); 

sck.send(encoding.ascii.getbytes("hello,this is client!")); 

sck.close(); 

呼叫socket的send方法,傳送完後關閉socket。

看看服務端:

ipaddress 

ia= 

ipaddress

.parse("192.168.1.152"); 

ipendpoint ie

= new

ipendpoint(ia, 12345); 

socket sck

= new

socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp); 

sck.bind(ie); 

sck.listen(10); 

socket client

= sck

.accept();//如果客戶端沒有連線來,則會阻塞到這裡 

byte data

= new

byte[1024]; 

int len

= client

.receive(data); 

messagebox.show(encoding.ascii.getstring(data, 0, len)); 

client.close(); 

sck.close(); 

我們發現我們的程式有個問題:

客戶端連線,程式繼續,接受客戶端,然後接收資料,然後關閉客戶端連線,接著服務端也關閉了。

套接字程式設計

1 ipv4 通用套接字的位址結構 struct socketaddr2 ipv6 3 值 結果引數 有點迷糊 套接字位址結構大小作為乙個指標傳給核心的原因 當函式被核心呼叫時,大小結構是乙個值 value 告訴核心該結構的大小,核心在寫該結構時不會越界。當函式返回時,結構大小是乙個結果 resul...

套接字程式設計

例1 建立sockaddr in結構體變數,並繫結套接字 建立套接字 int serv sock socket af inet,sock stream,ipproto tcp 建立sockaddr in結構體變數 struct sockaddr in serv addr memset serv ad...

python套接字程式設計 python套接字程式設計

服務端 usr bin python coding utf 8 import socket s socket.socket host socket.gethostname port 12345 s.bind host,port s.listen 5 while true c,addr s.accep...