4 3 實現迭代伺服器端 客戶端

2021-08-15 12:32:54 字數 3635 閱讀 3140

標題寫的是「實現迭代伺服器端/客戶端」,實際上就是實現了乙個有echo功能的,單使用者服務的(單程序/執行緒)伺服器端,再配上乙個客戶端。

伺服器端的說明

該伺服器端是僅面向單使用者的,處理有限次使用者任務的。

伺服器端僅僅是將使用者由tcp傳送來的資訊(上限1024bytes)回顯至客戶端

與《tcp/ip網路程式設計》一書中的實現有些許不同

伺服器端的c++**如下

#include #include // ----- 以上是c++庫,以下是使用的c庫 -----

#include #include #include #include #include const int bufsize = 1024; // 定義的訊息長度上限

void error_handling(const std::string &message); // 錯誤處理函式宣告

int main(int argc, char *argv)

serv_sock = socket(pf_inet, sock_stream, 0); // ipv4, tcp

if(serv_sock == -1)

error_handling("socket() error");

memset(&serv_addr, 0, sizeof(serv_addr)); // 初始化伺服器socket結構體

serv_addr.sin_family = af_inet;

serv_addr.sin_addr.s_addr = htonl(inaddr_any);

serv_addr.sin_port = htons(atoi(argv[1]));

if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1) // 繫結伺服器socket至相應ip與port

error_handling("bind() error");

if(listen(serv_sock, 3) == -1) // listen()函式的第二個引數指的是「連線請求等待佇列」的長度,這裡允許3個連線請求進入佇列

error_handling("listen() error");

clnt_addr_sz = sizeof(clnt_addr);

for(size_t cnt = 0; cnt < 3; ++cnt)

close(serv_sock);

return 0;

}void error_handling(const std::string &message)

客戶端的說明

連線成功後便可輸入訊息,傳送後從伺服器端讀取回顯的訊息

輸入單字母'q'退出

客戶端的**

#include #include #include #include #include #include #include const int bufsize = 1024;

void error_handling(const std::string &message);

int main(int argc, char *argv)

sock = socket(pf_inet, sock_stream, 0);

if(sock == -1)

error_handling("socket() error");

memset(&serv_addr, 0, sizeof(serv_addr));

serv_addr.sin_family = af_inet;

serv_addr.sin_addr.s_addr = inet_addr(argv[1]);

serv_addr.sin_port = htons(atoi(argv[2]));

if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)

error_handling("connect() error!");

else

std::cout << "connected......" << std::endl;

while(true)

close(sock);

return 0;

}void error_handling(const std::string &message)

執行結果:

伺服器端:

zzzbkl@myubuntu:~/inetpg/netecho$ ./echo_server 1234

connected client 0

connected client 1

connected client 2

客戶端:

zzzbkl@myubuntu:~/inetpg/netecho$ ./echo_client 127.0.0.1 1234connected......

input message('q' to quit):hello server!

message from server: hello server!

input message('q' to quit):this is client1!

message from server: this is client1!

input message('q' to quit):q

zzzbkl@myubuntu:~/inetpg/netecho$ ./echo_client 127.0.0.1 1234connected......

input message('q' to quit):hey server, this is client2

message from server: hey server, this is client2

input message('q' to quit):q

zzzbkl@myubuntu:~/inetpg/netecho$ ./echo_client 127.0.0.1 1234connected......

input message('q' to quit):wake up server

message from server: wake up server

input message('q' to quit):client3 here

message from server: client3 here

input message('q' to quit):q

小記:

關於listen函式與accpet函式

listen(socket, n),該函式使得socket轉化為等待連線請求的狀態,n指連線請求等待佇列的長度。n == 7 時表示最多允許7個連線請求進入佇列。當佇列已滿的時候,伺服器端套接字會拒絕新的連線請求。對於已經進入佇列的請求,伺服器端套接字按照佇列順序,通過呼叫accpet()函式將乙個請求轉化為處理狀態,接下來就可以進行請求的處理。處理完畢後再次呼叫accpet函式便可以處理下乙個請求。若隊列為空,則accpet函式會等待。

實現迭代伺服器端和客戶端

前面的程式,不管伺服器端還是客戶端,都有乙個問題,就是處理完乙個請求立即退出了,沒有太大的實際意義。能不能像web伺服器那樣一直接受客戶端的請求呢?能,使用 while 迴圈即可。修改前面的回聲程式,使伺服器端可以不斷響應客戶端的請求。伺服器端 server.cpp include include ...

網路程式設計 實現迭代回聲伺服器端 客戶端

1.直接跳轉到linux端 2.直接跳轉到windows端 掌握tcp套接字工作原理。在linux和windows作業系統上編寫迭代伺服器端 客戶端。讓伺服器端以迭代方式執行,為多個客戶端提供回聲服務。1 在linux作業系統上編寫程式,實現迭代回聲伺服器端 客戶端 1 改進實驗一中實現的hello...

oracle客戶端訪問伺服器端

1.客戶端工具 可以使用sqlplus,oacle sql developer,pl sql developer 最近專案用到了oracle,使用的是oracle10g,因為小組內有多人使用資料庫,並且oracle資料庫很佔內 存,就放在單獨的一台伺服器上,所以最好每個人都裝乙個oracle10g的...