C 控制台實現客戶端與服務端即時通訊(C S)

2021-10-08 23:31:03 字數 4428 閱讀 9241

這次的知識都在源**中 可結合檢視

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 使...