初遇SOCKET套接字(簡單通訊步驟)

2021-06-14 04:38:40 字數 3920 閱讀 4344

伺服器端程式設計的步驟

1:載入套接字型檔,建立套接字(wsastartup()/socket());

2:繫結套接字到乙個ip位址和乙個埠上(bind());

3:將套接字設定為監聽模式等待連線請求(listen());

4:請求到來後,接受連線請求,返回乙個新的對應於此次連線的套接字(accept());

5:用返回的套接字和客戶端進行通訊(send()/recv());

6:返回,等待另一連線請求;

7:關閉套接字,關閉載入的套接字型檔(closesocket()/wsacleanup())。

客戶端程式設計的步驟

1:載入套接字型檔,建立套接字(wsastartup()/socket());

2:向伺服器發出連線請求(connect());

3:和伺服器端進行通訊(send()/recv());

4:關閉套接字,關閉載入的套接字型檔(closesocket()/wsacleanup())

socket開發所必須需要的檔案(以winsock v2.0為例):

標頭檔案:winsock2.h

庫檔案:ws2_32.lib

動態庫:w32_32.dll

第一步: 載入/釋放winsock庫

1.載入

wsadata wsa;

/*初始化socket資源*/

if (wsastartup(makeword(1,1),&wsa) != 0)

2.釋放方法

wsacleanup();

第二步: 構造socket

1.服務端:構造監聽socket,流式socket.

socket listen_sock = socket(af_inet, sock_stream, 0);

2.客戶端:構造通訊socket,流式socket.

socket client_sock = socket(af_inet, sock_stream, 0);

第三步:配置監聽位址和埠

1.服務端

sockaddr_in serveraddr;

zeromemory((char *)&serveraddr,sizeof(serveraddr));

serveraddr.sin_family = af_inet;

serveraddr.sin_port = htons(1234); /*本地監聽埠:1234*/

serveraddr.sin_addr.s_addr = htonl(inaddr_any); /*有ip*/

sockaddr_in結構

struct sockaddr_in ;

sin _family為網路位址型別,必須設定為af_inet。

sin_port為服務埠,注意不要使用已固定的服務埠,如http的埠80等。如果埠設定為0,則系統會自動分配乙個唯一埠。sin_addr為乙個unsigned long的ip位址。sin_zero為填充字段,純粹用來保證結構的大小。如果將sin_addr設定為inaddr_any,則表示所有的ip位址,也即所有的計算機。

例如:unsigned long addr=inet_addr("192.1.8.84")

第四步:繫結socket

1.服務端:繫結監聽socket.

bind(listen_sock,(struct sockaddr *)&serveraddr,sizeof(serveraddr))

第五步: 服務端/客戶端連線

1.服務端:等待客戶端接入.

socket command_sock = accept(listen_sock, ...);

2.客戶端:請求與服務端連線.

int ret = connect(client_sock, ...);

第六步: 收/發資料

1.服務端:等待客戶端接入.

char buf[1024];
接收資料:
recv(command_sock,buf, ...);
傳送資料:
send(command_sock,buf, ...);

2.客戶端:請求與服務端連線.

傳送資料:

send(client_sock,buf, ...);
接收資料:
recv(client_sock,buf, ...);

第七步: 關閉socket

1.服務端:關閉socket.

closesocket(listen_sock);

closesocket(command_sock);

2.客戶端:關閉socket.

closesocket(client_sock);

完整**如下:

#include #include void main()

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

hibyte( wsadata.wversion ) != 1 )

socket socksrv=socket(af_inet,sock_stream,0);

sockaddr_in addrsrv;

addrsrv.sin_addr.s_un.s_addr=htonl(inaddr_any);

addrsrv.sin_family=af_inet;

addrsrv.sin_port=htons(6000);

bind(socksrv,(sockaddr*)&addrsrv,sizeof(sockaddr));

listen(socksrv,5);

sockaddr_in addrclient;

intlen=sizeof(sockaddr);

while(1)

}

#include #include void main()

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

hibyte( wsadata.wversion ) != 1 )

socket sockclient=socket(af_inet,sock_stream,0);

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

send(sockclient,"hello",strlen("hello")+1,0);

char recvbuf[50];

recv(sockclient,recvbuf,50,0);

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

closesocket(sockclient);

wsacleanup();

}

socket 套接字通訊

要通過internet進行通訊,至少需要一對套接字,其中乙個執行在客戶端,稱之為clientsocket,另乙個執行於伺服器端面,稱為serversocket。根據連線啟動的方式以及本地要連線的目標,套接字之間的連線過程可以分為三個步驟 伺服器監聽 客戶端請求 連線確認。伺服器監聽是指服務端套接字並...

利用Socket套接字通訊

我只寫了服務端程式。服務端會了,客服端就好寫了。我的伺服器功能是個小計算器。server.c socket 實現通訊。客服端輸入表示式經過伺服器計算出結果發給客服端 伺服器端建立任務 監聽客戶端,收到資料,發給服務端的子程序讓子程式,子程式呼叫execlp bc命令計算出結果給父程序,父程序傳給伺服...

java通訊 套接字Socket

無論用什麼語言開發,socket都是繞不過去的乙個環節,若以簡單論,除了檔案操作,程序間通過socket通訊還是比較方便的。對於主機a和b,若a主機想向b主機傳送資訊,那麼基本步驟如下 1.首先確保b主機上socket服務端開啟,服務端會監聽本機上的乙個埠,例如8080。socket服務端會以阻塞形...