伺服器與客戶端

2021-07-28 15:06:17 字數 4148 閱讀 1127

// 建立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");

return

0;

}

// client.cpp  

#include

#include

#include

using

namespace

std;

int main()

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");

return

0;

}

客戶端與伺服器

cs與bs 軟體使用方式上的兩種劃分 c s client server pc客戶端與伺服器架構 特點 在伺服器當中就主要是乙個資料庫,把所有業務邏輯都交給客戶端來完成 優點 較為安全,使用者介面豐富,客戶體驗好 缺點 每次公升級都要重新安裝,針對不同的作業系統開發,可移植性差 b sbrowser...

伺服器與客戶端 client

include include include include include include include define serv port 9000 define buff size 1024 struct user void fillmsg struct user userinfo void...

客戶端與伺服器模型

1.2 mysqld乙個二進位制程式,後台的守護程序 2.應用程連線mysql方式 總結 什麼是例項 圖1.1 word的開啟方式 圖1.2 mysqld的開啟方式 mysqld伺服器程式構成 mysqld是乙個守護程序但是本身不能自主啟動 root db01 mysql uroot poldboy...