Socket 程式設計

2021-08-09 04:02:46 字數 3575 閱讀 9962

分3個部分,首先介紹socket基本概念(主要參考《socket程式設計》);然後分別是基於mfc的socket程式設計(參考《mfc socket網路程式設計(流程示例)》)和基於c#的socket程式設計(參考《你得學會並且學得會的socket程式設計基礎知識》)

如圖1所示,傳輸控制協議/網間協議(tcp/ip)是乙個工業標準的協議集,包含了運輸層、網路層、鏈路層

socket 是應用層與tcp/ip協議族通訊的中間軟體抽象層,將複雜的tcp/ip隱藏在一系列socket介面後面

圖1. scoket抽象層

一次標準的socket通訊為(圖2):

服務端首先初始化socket,然後繫結並監聽埠,阻塞直到有客戶端連線,接著使用send和receive方法與客戶端互動,最後關閉socket;

客戶端首先初始化socket,然後根據ip和埠與服務端連線,成功後通過send和receive方法與之互動,最後關閉socket

圖2. socket通訊

載入套接字(socket)庫

建立套接字

繫結套接字到本地位址和埠

將套接字設為監聽模式

等待客戶請求到來,當請求到來後接受並返回此次連線的套接字

使用上一步的套接字和客戶端通訊(send/recv)

關閉套接字

#include //加裁標頭檔案 

#include //載入標準輸入輸出標頭檔案

void main()

//載入套接字型檔,加裁失敗則返回

if ( lobyte( wsadata.wversion ) != 1 ||hibyte( wsadata.wversion ) != 1 )

//如果不是1.1的則退出

socket socksrv=socket(af_inet,sock_stream,0);//建立套接字(socket)。

sockaddr_in addrsrv;

addrsrv.sin_addr.s_un.s_addr=htonl(inaddr_any);//轉換unsigned short為網路位元組序的格式

addrsrv.sin_family=af_inet;

addrsrv.sin_port=htons(6000);

bind(socksrv,(sockaddr*)&addrsrv,sizeof(sockaddr)); //將套接字繫結到乙個本地位址和埠上(bind)

listen(socksrv,5);//將套接字設為監聽模式,準備接收客戶請求(listen)。

sockaddr_in addrclient;//定義位址族

int len=sizeof(sockaddr);//初始化這個引數,這個引數必須被初始化

while(1)

}

載入套接字型檔

建立套接字

向伺服器發出連線請求

和伺服器進行通訊(send/recv)

關閉套接字

#include 

#include

void main()

if ( lobyte( wsadata.wversion ) != 1 || hibyte( wsadata.wversion ) != 1 )

socket sockclient=socket(af_inet,sock_stream,0);//建立套接字(socket)。

sockaddr_in addrsrv;

addrsrv.sin_addr.s_un.s_addr=inet_addr("127.0.0.1");

addrsrv.sin_family=af_inet;

addrsrv.sin_port=htons(6000);

connect(sockclient,(sockaddr*)&addrsrv,sizeof(sockaddr));//向伺服器發出連線請求(connect)。

char recvbuf[100];//和伺服器端進行通訊(send/recv)。

recv(sockclient,recvbuf,100,0);

printf("%s\n",recvbuf);

send(sockclient,"this is blues_j",strlen("this is blues_j")+1,0);

closesocket(sockclient);//關閉套接字。

wsacleanup();//必須呼叫這個函式清除引數

}

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.net.sockets;

using system.net;

namespace socket_server

catch (socketexception ex)

}else

};timer.start();

//接收客戶端訊息

client.beginreceive(buffer, 0, buffer.length, socketflags.none, new asynccallback(receivemessage), client);

}), null);

console.writeline

("[" + serverip[2].tostring() + ":" + port.tostring() + "]" + "server is ready!");

console.read

(); }

static

byte buffer = new

byte[1024];

public

static

void

receivemessage

(iasyncresult ar)

catch

(exception ex)}}

}

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.net.sockets;

namespace socketclient

}static

byte buffer = new

byte[1024];

public

static

void

receivemessage(iasyncresult ar)

catch(exception ex)}}

socket程式設計

一直以為serversocket accept之後客戶端才能發資訊,實驗後得出如下結論 1 serversocket沒有accept時,client是可以傳送資訊到server端的。2 serversocket accept之後,正在處理訊息時,client也是可以傳送資訊到server端。如果se...

Socket程式設計

對tcp ip udp socket程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問 1.什麼是tcp ip udp?2.socket在 呢?3.socket是什麼呢?4.你會使用它們嗎?什麼是tcp ip udp?tcp ip transmission cont...

socket程式設計

建立socket 建立乙個 socket,它可用於在基於 tcp ip 的網路 如 internet 上通訊。socket s new socket addressfamily.internetwork,sockettype.stream,protocoltype.tcp 若要使用 udp 而不是 ...