這次的知識都在源**中 可結合檢視
ps:通訊只設定了五次,do while換成while(1)再判斷一下是否退出即可
// server.cpp
#include
#include
#include
#include
#pragma comment(lib, "ws2_32.lib")
using
namespace std;
intmain()
if(lobyte
(wsadata.wversion)!=1
||hibyte
(wsadata.wversion)!=1
)// 建立socket操作,建立流式套接字,返回套接字型大小socksrv
// socket socket(int af, int type, int protocol);
// 第乙個引數,指定位址簇(tcp/ip只能是af_inet,也可寫成pf_inet)
// 第二個,選擇套接字的型別(流式套接字)
socket socksrv =
socket
(af_inet, sock_stream,0)
;// 套接字socksrv與本地位址相連
// int bind(socket s, const struct sockaddr* name, int namelen);
// 第乙個引數,指定需要繫結的套接字;
// 第二個引數,指定該套接字的本地位址資訊,該位址結構會隨所用的網路協議的不同而不同
// 第三個引數,指定該網路協議位址的長度
// ps: struct sockaddr;
// sa_family指定該位址家族, sa_data起到佔位占用一塊記憶體分配區的作用
// 在tcp/ip中,可使用sockaddr_in結構替換sockaddr,以方便填寫位址資訊
// // struct sockaddr_in;
// sin_family表示位址族,對於ip位址,sin_family成員將一直是af_inet。
// sin_port指定將要分配給套接字的埠。
// sin_addr給出套接字的主機ip位址。
// sin_zero[8]給出填充數,讓sockaddr_in與sockaddr結構的長度一樣。
// 將ip位址指定為inaddr_any,允許套接字向任何分配給本地機器的ip位址傳送或接收資料。
// 如果想只讓套接字使用多個ip中的乙個位址,可指定實際位址,用inet_addr()函式。
sockaddr_in addrsrv;
addrsrv.sin_addr.s_un.s_addr =
htonl
(inaddr_any)
;// 將inaddr_any轉換為網路位元組序,呼叫 htonl(long型)或htons(整型)
addrsrv.sin_family = af_inet;
addrsrv.sin_port =
htons
(6000);
bind
(socksrv,
(sockaddr*
)&addrsrv,
sizeof
(sockaddr));
// 第二引數要強制型別轉換
// 將套接字設定為監聽模式(連線請求), listen()通知tcp伺服器準備好接收連線
// int listen(socket s, int backlog);
// 第乙個引數指定需要設定的套接字,第二個引數為(等待連線佇列的最大長度)
listen
(socksrv,10)
;// accept(),接收連線,等待客戶端連線
// socket accept( socket s, struct sockaddr* addr, int* addrlen);
// 第乙個引數,接收乙個處於監聽狀態下的套接字
// 第二個引數,sockaddr用於儲存客戶端位址的資訊
// 第三個引數,用於指定這個位址的長度
// 返回的是向與這個監聽狀態下的套接字通訊的套接字
// 客戶端與使用者端進行通訊
// send(), 在套接字上傳送資料
// int send( socket s, const char* buf, int len, int flags);
// 第乙個引數,需要傳送資訊的套接字,
// 第二個引數,包含了需要被傳送的資料,
// 第三個引數是buffer的資料長度,
// 第四個引數,一些傳送引數的設定
// recv(), 在套接字上接收資料
// int recv( socket s, char* buf, int len, int flags);
// 第乙個引數,建立連線後的套接字,
// 第二個引數,接收資料
// 第三個引數,接收資料的長度,
// 第四個引數,一些傳送引數的設定
sockaddr_in addrclient;
int len =
sizeof
(sockaddr)
;while
(true
)printf
("\nend talking... \n");
closesocket
(sockconn);}
printf
("\n");
system
("pause");
return0;
}
// client.cpp
#include
#include
#include
#include
using
namespace std;
#pragma comment(lib, "ws2_32.lib")
intmain()
if(lobyte
(wsadata.wversion)!=1
||hibyte
(wsadata.wversion)!=1
)// 建立socket操作,建立流式套接字,返回套接字型大小sockclient
// socket socket(int af, int type, int protocol);
// 第乙個引數,指定位址簇(tcp/ip只能是af_inet,也可寫成pf_inet)
socket sockclient =
socket
(af_inet, sock_stream,0)
;// 將套接字sockclient與遠端主機相連
// int connect( socket s, const struct sockaddr* name, int namelen);
// 第乙個引數:需要進行連線操作的套接字
// 第三個引數:位址的長度
sockaddr_in addrsrv;
addrsrv.sin_addr.s_un.s_addr =
inet_addr
("127.0.0.1");
// 本地迴路位址是127.0.0.1;
addrsrv.sin_family = af_inet;
addrsrv.sin_port =
htons
(6000);
connect
(sockclient,
(sockaddr*
)&addrsrv,
sizeof
(sockaddr));
char recvbuf[
100]
;recv
(sockclient, recvbuf,
100,0)
;printf
("%s\n"
, recvbuf)
;send
(sockclient,
"attention: a client has enter...\n"
,strlen
("attention: a client has enter...\n")+
1,0)
;printf
("我們可以聊五句話");
int n =5;
dowhile
(--n)
;printf
("end linking...\n");
closesocket
(sockclient)
;wsacleanup()
;// 終止對套接字型檔的使用
printf
("\n");
system
("pause");
return0;
}
C 服務端與客戶端
c 服務端與客戶端連線實現的由來 那麼既然乙個伺服器端口可以應對多個客戶端連線,那麼接下來我們就看一下,如何讓多個客戶端與服務端連線。如同我們上面所說的,乙個tcpclient就是乙個socket,所以我們只要建立多個tcpclient,然後再呼叫connect 方法就可以了 c 服務端與客戶端連線...
服務端與客戶端互動
搭建伺服器 伺服器端 using system.net.sockets using system.net using system.io using system.text namespace sockerservice endpoint point new ipendpoint ipaddress...
NodeJS TCP客戶端與服務端
server.js var net require net 載入網路模組 var clients 0 建立id來引用連線的每乙個客戶端 var server net.createserver function client client.write welcome client clientid 使...