標題寫的是「實現迭代伺服器端/客戶端」,實際上就是實現了乙個有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的...