C Socket程式設計例項解析

2021-08-01 10:49:42 字數 4307 閱讀 6257

socket本質是程式設計介面(api),對tcp/ip的封裝,tcp/ip也要提供可供程式設計師做網路開發所用的介面,這就是socket程式設計介面;http是轎車,提供了封裝或者顯示資料的具體形式;socket是發動機,提供了網路通訊的能力。 

在internet上的主機一般執行了多個服務軟體,同時提供幾種服務。每種服務都開啟乙個socket,並繫結到乙個埠上,不同的埠對應於不同的服務。socket正如其英文原意那樣,像乙個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有乙個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟體將插頭插到不同編號的插座,就可以得到不同的服務。—— [ 維基百科]

有三種不同形式的套接字:

資料報套接字(sock_dgram)

原始套接字(sock_raw)

原始套接字(socket_raw)允許對較低層次的協議直接訪問,比如ip、 icmp協議,它常用於檢驗新的協議實現,或者訪問現有服務中配置的新裝置,因為raw socket可以自如地控制windows下的多種協議,能夠對網路底層的傳輸機制進行控制,所以可以應用原始套接字來操縱網路層和傳輸層應用。比如,我們可以通過raw socket來接收發向本機的icmp、igmp協議包,或者接收tcp/ip棧不能夠處理的ip包,也可以用來傳送一些自定包頭或自定協議的ip包。網路監聽技術很大程度上依賴於socket_raw

基於tcp的socket使用流式套接字,相比於使用資料報套接字的udp來講,tcp可以使程式設計師不必關心資料正確性及順序正確性,缺點是效率較低。 

基於tcp的socket程式設計最常見的應用場景是在c/s架構下的分布式應用,針對客戶端和伺服器端提供不同的socket系統呼叫。

下面舉例說明其使用方式:

#include 

#include

#pragma comment(lib,"ws2_32.lib")

void main()

#include 

#include

#pragma comment(lib,"ws2_32.lib")

void main()

附socket程式設計步驟: 

伺服器端程式設計的步驟:

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())。 

二:伺服器端程式:

[cpp]view plain

copy

//#include "winsock2.h"

#pragma comment(lib, "ws2_32.lib")

#include 

using

namespace

std;  

intmain(

intargc, 

char

* argv)  

//建立套接字

sserver = socket(af_inet, sock_stream, ipproto_tcp);      

if(invalid_socket == sserver)  

//伺服器套接字位址 

addrserv.sin_family = af_inet;  

addrserv.sin_port = htons(4999);  

addrserv.sin_addr.s_addr = inaddr_any;        

//繫結套接字

retval = bind(sserver, (lpsockaddr)&addrserv, sizeof

(sockaddr_in));  

if(socket_error == retval)  

//開始監聽 

retval = listen(sserver, 1);  

if(socket_error == retval)  

//接受客戶端請求

sockaddr_in addrclient;  

intaddrclientlen = 

sizeof

(addrclient);  

sclient = accept(sserver,(sockaddr far*)&addrclient, &addrclientlen);  

if(invalid_socket == sclient)  

while

(true

)    

if(buf[0] == 

'0')  

break

;  cout << "客戶端傳送的資料: "

<< buf <

cout << "向客戶端傳送資料: "

;  cin >> sendbuf;  

send(sclient, sendbuf, strlen(sendbuf), 0);  

}  //退出

closesocket(sserver);   //關閉套接字

closesocket(sclient);   //關閉套接字

wsacleanup();           //釋放套接字資源;

return

0;  

}  

客戶端程式:

[cpp]view plain

copy

#include "winsock2.h"

#include 

#pragma comment(lib, "ws2_32.lib")

using

namespace

std;  

bool

recvline(socket s, 

char

* buf); 

//讀取一行資料

intmain(

intargc, 

char

* argv)  

//建立套接字

shost = socket(af_inet, sock_stream, ipproto_tcp);  

if(invalid_socket == shost)  

//設定伺服器位址

servaddr.sin_family =af_inet;  

servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"

);  

servaddr.sin_port = htons((short

)4999);  

intnservaddlen  = 

sizeof

(servaddr);  

//連線伺服器

retval=connect(shost,(lpsockaddr)&servaddr, sizeof

(servaddr));  

if(socket_error == retval)  

while

(true

)    

//recvline(shost, bufrecv);

zeromemory(bufrecv, buf_size);  

recv(shost, bufrecv,buf_size , 0); // 接收伺服器端的資料, 只接收5個字元

cout << endl <<"從伺服器接收資料:"

<< bufrecv;  

cout<<"\n"

;  }  

//退出

closesocket(shost); //關閉套接字

wsacleanup(); //釋放套接字資源

return

0;  

}  

C Socket程式設計例項解析

socket本質是程式設計介面 api 對tcp ip的封裝,tcp ip也要提供可供程式設計師做網路開發所用的介面,這就是socket程式設計介面 http是轎車,提供了封裝或者顯示資料的具體形式 socket是發動機,提供了網路通訊的能力。在internet上的主機一般執行了多個服務軟體,同時提...

C socket程式設計例項

include stdafx.h include pragma comment lib,ws2 32.lib define port number 11234 define max buf size 1024 int tmain int argc,tchar argv socket nsocket ...

C Socket 程式設計簡單例項

c console 程式設計 伺服器端 csharpconsolesokecttestserver.cs using system using system.collections.generic using system.text using system.net using system.net...