unix環境程式設計很好闡述socket的概念:
socket起源於unix,而unix/linux基本哲學之一就是「一切皆檔案」,都可以用「開啟open –> 讀寫write/read –> 關閉close」模式來操作。我的理解就是socket就是該模式的乙個實現,socket即是一種特殊的檔案,一些socket函式就是對其進行的操作(讀/寫io、開啟、關閉)。
對於tcp需要掌握三次握手和四次拆鏈的整個過程,下圖就是程式設計所使用的介面函式,以及tcp的狀態遷移變化,其中細節很多,專業知識很多,需要查詢更多的資料了解,本文主要實戰tcp的程式設計。
三、實戰
服務端:
#include
#include
#pragma comment(lib, "ws2_32.lib")
#define connect_num_max 10
using namespace std;
intmain()
if(2!=
lobyte
(wsadata.wversion)||2
!=hibyte
(wsadata.wversion)
)/*建立套接字*/
socket serversocket =
socket
(af_inet, sock_stream, ipproto_tcp);if
(invalid_socket == serversocket)
//初始化伺服器位址族變數
sockaddr_in addrsrv;
addrsrv.sin_addr.s_un.s_addr =
htonl
(inaddr_any)
; addrsrv.sin_family = af_inet;
addrsrv.sin_port =
htons
(6000);
//繫結
iret =
bind
(serversocket,
(sockaddr*
)&addrsrv,
sizeof
(sockaddr));
if(iret == socket_error)
//監聽
iret =
listen
(serversocket,1)
;if(iret == socket_error)
cout <<
"listen success!"
<< endl;
//等待連線_接收_傳送
sockaddr_in clientaddr;
int len =
sizeof
(sockaddr)
; socket clientsocket =
accept
(serversocket,
(sockaddr*
)&clientaddr,
&len);if
(clientsocket == invalid_socket)
cout <<
"welcome "
<<
inet_ntoa
(clientaddr.sin_addr)
<< endl;
while(1
);recv
(clientsocket, recvbuf,
100,0)
; cout <<
"the date of sending by client:"
<< recvbuf <
char sendbuf[
100]=;
cout <<
"sending data to the client:"
; cin >> sendbuf;
send
(clientsocket, sendbuf,
strlen
(sendbuf),0
);}closesocket
(serversocket)
;closesocket
(clientsocket)
;wsacleanup()
;system
("pause");
return0;
}
客戶端:
#include
#include
using namespace std;
#pragma comment(lib, "ws2_32.lib")
intmain()
if(2!=
lobyte
(wsadata.wversion)||2
!=hibyte
(wsadata.wversion)
)//建立套接字
socket clientsocket =
socket
(af_inet, sock_stream,0)
;if(clientsocket == invalid_socket)
//初始化伺服器端位址族變數
sockaddr_in srvaddr;
srvaddr.sin_addr.s_un.s_addr =
inet_addr
("10.40.150.173");
srvaddr.sin_family = af_inet;
srvaddr.sin_port =
htons
(6000);
//連線伺服器
iret =
connect
(clientsocket,
(sockaddr*
)&srvaddr,
sizeof
(sockaddr));
if(0!= iret)
cout<<
"connetc "
<<
inet_ntoa
(srvaddr.sin_addr)
<<
" success"
<
while(1
);cout << endl<<
"sending data to the server:"
; cin >> sendbuf;
send
(clientsocket, sendbuf,
strlen
(sendbuf)+1
,0);
//接收訊息
char recvbuf[
100]=;
recv
(clientsocket, recvbuf,
100,0)
; cout <<
"accepting data from server:"
<< recvbuf;
}//清理
closesocket
(clientsocket)
;wsacleanup()
;system
("pause");
return0;
}
TCP與UDP的區別,以及Http和Socket
udp tcp面向有鏈結的通訊服務 udp面向無連線的通訊服務 tcp提供可靠的通訊傳輸 udp不可靠,會丟包 tcp保證資料順序 udp不保證 tcp資料無邊界 udp有邊界 tcp速度慢 udp速度快 tcp面向位元組流 udp面向報文 tcp一對一 udp可以一對一,一對多 tcp報頭至少20...
windows 下TCP最大連線數
在做socket 程式設計時,我們經常會要問,單機最多可以建立多少個 tcp 連線,本文將介紹如何調整系統引數來調整單機的最大tcp連線數。windows 下單機的tcp連線數有多個引數共同決定,下面一一介紹 hkey local machine system currentcontrolset s...
TCP通訊指定客戶端接收資料的埠 Socket
使用socket實現tcp通訊時,服務端響應資料給客戶端時,客戶端接收資料的埠是隨機的。如果想指定客戶端接收資料的埠,那麼可以在客戶端建立socket時使用如下api socket new socket ip,serverport,inetaddress.getbyname getlocalipad...