socket本質是程式設計介面(api),對tcp/ip的封裝,tcp/ip也要提供可供程式設計師做網路開發所用的介面,這就是socket程式設計介面;http是轎車,提供了封裝或者顯示資料的具體形式;socket是發動機,提供了網路通訊的能力。有三種不同形式的套接字:在internet上的主機一般執行了多個服務軟體,同時提供幾種服務。每種服務都開啟乙個socket,並繫結到乙個埠上,不同的埠對應於不同的服務。socket正如其英文原意那樣,像乙個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有乙個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟體將插頭插到不同編號的插座,就可以得到不同的服務。—— [ 維基百科]
基於tcp的socket使用流式套接字,相比於使用資料報套接字的udp來講,tcp可以使程式設計師不必關心資料正確性及順序正確性,缺點是效率較低。資料報套接字(sock_dgram)
原始套接字(sock_raw)
原始套接字(socket_raw)允許對較低層次的協議直接訪問,比如ip、 icmp協議,它常用於檢驗新的協議實現,或者訪問現有服務中配置的新裝置,因為raw socket可以自如地控制windows下的多種協議,能夠對網路底層的傳輸機制進行控制,所以可以應用原始套接字來操縱網路層和傳輸層應用。比如,我們可以通過raw socket來接收發向本機的icmp、igmp協議包,或者接收tcp/ip棧不能夠處理的ip包,也可以用來傳送一些自定包頭或自定協議的ip包。網路監聽技術很大程度上依賴於socket_raw
基於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...