中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

wordpress 支持html5/網站標題算關鍵詞優(yōu)化嗎

wordpress 支持html5,網站標題算關鍵詞優(yōu)化嗎,網站建設論文的中期報告,長沙做網站微聯訊點靠譜Linux下套接字TCP實現網絡通信 文章目錄 Linux下套接字TCP實現網絡通信1.引言2.具體實現2.1接口介紹1.socket()2.bind()3.listen()4.accept()5.connect() 2.2 服務器端server.hpp2.3服務端server.cc2.4客戶端client.cc 1.引言 ? 套接字(Socket)是計算機網絡中實現網絡通信的一…

Linux下套接字TCP實現網絡通信

文章目錄

  • Linux下套接字TCP實現網絡通信
  • 1.引言
  • 2.具體實現
    • 2.1接口介紹
      • 1.socket()
      • 2.bind()
      • 3.listen()
      • 4.accept()
      • 5.connect()
    • 2.2 服務器端server.hpp
    • 2.3服務端server.cc
    • 2.4客戶端client.cc

1.引言

? 套接字(Socket)是計算機網絡中實現網絡通信的一種編程接口。它提供了應用程序與網絡通信之間的一座橋梁,因為它允許應用程序通過網絡發(fā)送和接收相應的數據以實現不同主機之間的通信。
在這里插入圖片描述

通常套接字由以下兩部分組成:

1.網絡IP和端口號:IP用來標識主機,而端口號可以標識到單臺主機的唯一進程。

2.通信協(xié)議:套接字通過規(guī)定通信協(xié)議來制定數據傳輸和發(fā)送的規(guī)則。常見的有TCP和UDP等協(xié)議。

TCP是一種面向連接的協(xié)議,提供可靠的、有序的、基于字節(jié)流的數據傳輸。

UDP是一種無連接的協(xié)議,提供不可靠的、無序的、基于數據報的數據傳輸。

? 今天我們來學習TCP實現網絡通信。TCP由于能提供可靠、基于字節(jié)流的數據傳輸,使用率與使用場景也比UDP多很多。

我們來看看能實現出什么樣的結果(聊天室模擬兩個用戶隨機通信):

若不開啟服務端就只開啟客戶端的話,那么就會像打游戲的某些情況連不上:
在這里插入圖片描述

當服務端和客戶端都開啟后就可以正常通信了:

在這里插入圖片描述

這里我們還是通過客戶端給服務器端發(fā)送消息,通過TCP鏈接實現通信。

那么事不宜遲,我們馬上開始分享實現過程吧!

2.具體實現

2.1接口介紹

1.socket()

? socket函數是用于創(chuàng)建套接字的函數,創(chuàng)建成功返回文件描述符fd,失敗返回-1

int socket(int domain, int type, int protocol);

? 參數說明:

  • domain

    :指定套接字的地址族(Address Family)

    今天我們選擇:

    • AF_INET:IPv4 地址族
  • type

    :指定套接字的類型(Socket Type)

    今天我們選擇:

    • SOCK_STREAM:有連接的字節(jié)流套接字,用于TCP協(xié)議
  • protocol

    :可選參數,指定具體的傳輸協(xié)議。常用的有:

    ? 今天我們選擇:

    • 0:自動選擇合適的協(xié)議

2.bind()

? 在Linux下,bind() 函數用于將一個套接字(socket)與特定的IP地址和端口號進行綁定。

*int bind(int sockfd, const struct sockaddr addr,socklen_t addrlen);

參數說明:

  • sockfd:要進行綁定的套接字的文件描述符。
  • addr:指向一個 struct sockaddr 結構體的指針,其中包含要綁定的IP地址和端口號信息。
  • addrlenaddr 結構體的長度。

在綁定bind的第二個參數中,我們也需要用到庫中定義好的sockaddr_in結構體來初始化!

具體結構體struct sockaddr_in說明:

結構體中有三個值也需要初始化指定一下:

  1. sin_family:表示地址族(Address Family),一般為 AF_INET

  2. sin_port:表示端口號。它是一個 16 位的整數,使用網絡字節(jié)序(大端字節(jié)序)表示。在使用時,通常需要使用 htons() 函數將主機字節(jié)序轉換為網絡字節(jié)序。

  3. sin_addr:表示 IPv4 地址。它是一個 struct in_addr 類型的結構體,用于存儲 32 位的 IPv4 地址。

    一般服務端用INADDR_ANY,讓udp_server在啟動時候可以綁定任何ip.

    ? 客戶端用inet_addr函數將字符串轉化成32位無符號整數


3.listen()

? listen()函數:將套接字設置為監(jiān)聽狀態(tài),等待連接請求。

參數:

  • sockfd:套接字的文件描述符。這里我們選擇前面socket創(chuàng)建好的返回值.
  • backlog:指定等待連接隊列的最大長度。一般不會太大,我們這里寫32即可。

4.accept()

accept() 函數:接受客戶端的連接請求,創(chuàng)建一個新的套接字用于與客戶端進行通信。

參數:

  • sockfd:套接字的文件描述符。這里我們選擇前面socket創(chuàng)建好的返回值.
  • addr:指向客戶端地址的結構體指針。創(chuàng)建一個sockaddr的結構體強轉一下(struct sockaddr*)即可。
  • addrlen:客戶端地址結構體的字節(jié)大小。創(chuàng)建一個socklen_t類型的值用來計算結構體大小。

5.connect()

connect() 函數:發(fā)起與遠程主機建立TCP連接的請求。

參數:

  • sockfd:套接字的文件描述符。這里我們選擇前面socket創(chuàng)建好的返回值.
  • addr:指向遠程主機地址的結構體指針。創(chuàng)建一個sockaddr的結構體強轉一下(struct sockaddr*)即可。
  • addrlen:遠程主機地址結構體的字節(jié)大小。創(chuàng)建一個socklen_t類型的值用來計算結構體大小。

2.2 服務器端server.hpp

在整個服務器端server.hpp中,我們需要創(chuàng)建tcpServer類,并在類中建立這些成員:監(jiān)聽套接字、端口號等.

在類中我們還需要初始化服務器InitServer()和啟動服務器Start()兩個接口。

服務器端具體實現思路是:我們創(chuàng)建套接字socket()后開始綁定bind(),之后監(jiān)聽listen(),監(jiān)聽成功后我們獲取鏈接accept()即可。

思路簡單,但是實現還需要很多事完成:

static const uint16_t defaultport = 8081;
static const int backlog = 32;
using func_t = std::function<std::string(const std::string&)>;class tcpServer
{public:tcpServer(func_t func,uint16_t port = defaultport):_func(func),_port(port),_quit(true){}~tcpServer() {}void InitServer(){//1.創(chuàng)建套接字_listensock = socket(AF_INET,SOCK_STREAM,0);if(_listensock < 0){std::cerr << "create socket error" << std::endl;exit(-1);}//2.綁定struct sockaddr_in local;memset(&local,0,sizeof(local)); //清空結構體local.sin_family = AF_INET;local.sin_port = htons(_port);    //主機轉網絡local.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(_listensock,(struct sockaddr*)&local,sizeof(local)) < 0){std::cerr << "bind error" << std::endl;exit(-2);}//3.監(jiān)聽(tcp)if(listen(_listensock,backlog) < 0){std::cerr <<" listen error" << std::endl;exit(-3);}}void Start(){_quit = false; //運行時設置位運行狀態(tài),即不退出的狀態(tài)while(!_quit) //服務器死循環(huán){struct sockaddr_in client;socklen_t len = sizeof(client);//4.獲取鏈接acceptint sock = accept(_listensock,(struct sockaddr*)&client,&len);if(sock < 0) {std::cerr <<"accept error " <<std::endl;continue;} //攬客的sock失敗后繼續(xù)即可//5.獲取鏈接成功std::cout<< "獲取鏈接成功" << sock << " from " << _listensock <<  std::endl;service(sock);}}void service(int sock) //服務{char buffer[1024];while(true){ssize_t s = read(sock,buffer,sizeof(buffer)-1);if(s > 0) //代表成功讀取{buffer[s] = 0;std::string res = _func(buffer); //回調顯示std::cout<< res <<std::endl;write(sock,res.c_str(),res.size());}else if(s == 0) //代表讀到文件結尾 在網絡中就相當于對方關閉鏈接{close(sock);std::cout << "quit" <<std::endl;break;}else //文件讀取失敗{close(sock);std::cerr << " read error" <<std::endl;break;}}}private:uint16_t _port; //端口號int _listensock; //監(jiān)聽套接字bool _quit; //代表服務器沒有運行的狀態(tài)func_t _func; //回調包裝器,為了后面輸出后回顯
};

2.3服務端server.cc

在服務端的主文件中,我們直接包含上面的頭文件。

我們期望的用法是:./tcp_server port,代表運行可執(zhí)行文件后面需要帶一個參數:端口號

所以我們能夠從用戶中輸入的port,通過main函數中的**char* argv[]**參數列表中獲取到。并傳給tcpSercer類中初始化與啟動服務器即可。

#include "server.hpp"
#include<memory>
using namespace std;static void usage(string proc) //使用手冊,代表運行可執(zhí)行文件后面需要帶一個參數:端口號
{std::cout << "Usage:\n\t" << proc << "port\n" <<std::endl;}std::string echo(const std::string& message)//輸出回顯
{return message;
}//期望用法:./tcp_server port
int main(int argc,char* argv[])
{if(argc != 2) //輸入的不是兩個參數,說明你不會用。輸出使用手冊{usage(argv[0]);exit(-1);}uint16_t port = atoi(argv[1]); //強轉成能夠使用的類型unique_ptr<tcpServer> ts(new tcpServer(echo,port));//采用智能指針創(chuàng)建釋放資源ts->InitServer();ts->Start();return 0;
}

2.4客戶端client.cc

在客戶端中我們conncet嘗試鏈接到服務器端,這里需要做一個重連反饋:正在嘗試重連…

我們期望運行格式:./client serverip serverport,代表運行可執(zhí)行文件后需要兩個參數:IP和端口

我們從用戶輸入的兩個參數中傳給main,并通過main參數char* argv[]參數列表獲取到,之后獲取到直接轉化即可。


static void usage(string proc)
{std::cout << "Usage:\n\t" << proc << "serverip serverport\n" <<std::endl;}
//期望使用:./client serverip serverport 
int main(int argc,char* argv[])
{if(argc != 3){usage(argv[0]);exit(-2);}string serverip = argv[1]; //獲取到參數uint16_t port = atoi(argv[2]);//1.創(chuàng)捷套接字int sock = socket(AF_INET,SOCK_STREAM,0);if(sock < 0){std::cerr << " socket error" <<std::endl;exit(-1);}//2.客戶端需要鏈接服務器 --connectstruct sockaddr_in server; //memset(&server,0,sizeof(server)); //清空結構體server.sin_family = AF_INET;//初始化結構體server.sin_port = htons(port);//server.sin_addr.s_addr = inet_addr(serverip.c_str()); //客戶端inet_aton(serverip.c_str(),&(server.sin_addr));int cnt = 5;while(connect(sock,(struct sockaddr*)&server,sizeof(server)) != 0) //如果綁定失敗{sleep(1);std::cout<<"正在嘗試重連... 重連次數:" <<cnt-- <<std::endl;if(cnt <= 0) break;}    if(cnt <= 0){cerr<< "服務器連接失敗"<<endl;exit(-1);}//3.連接成功while(true) //連接成功后從客戶端直接輸入發(fā)送數據{string line;char buffer[1024];cout<<"Enter>> "; getline(cin,line);write(sock,line.c_str(),line.size()); //給緩沖區(qū)寫數據ssize_t s = read(sock,buffer,sizeof(buffer) -1);if(s > 0)//正常寫{buffer[s] = 0;cout<< " server rcho >>>" <<buffer <<endl;}else if(s == 0) //寫結束{cerr << "server quit" <<endl;break;}else{ //異常cerr<< " read error " <<endl;break;}}close(sock);//關閉套接字,管不管都可以return 0;
}

最后運行之后就能獲得我們之前通信的結果了:

在這里插入圖片描述

http://www.risenshineclean.com/news/55.html

相關文章:

  • 在京東上怎樣做網站/免費平臺推廣
  • 阿里自助建站平臺/網站優(yōu)化公司收費
  • 如何建立一個網站分享教程/推廣賺傭金的軟件排名
  • 網站設計寬屏/品牌策略有哪些
  • 網站建設系統(tǒng)哪個好/seo點擊排名軟件營銷工具
  • 建設文明網 聯盟網站的/學seo推廣
  • 武漢網站建設 loongnet/百度云官網
  • 如何建設一個屬于自己的網站/引擎優(yōu)化seo
  • 南寧做網站外包/品牌宣傳策略有哪些
  • 怎樣做網站反鏈/北京網站優(yōu)化多少錢
  • 軟件外包收費標準/重慶網站關鍵詞排名優(yōu)化
  • 網站建設ppt答辯/seo優(yōu)化包括什么
  • 網站建設網址網站制作/長沙百度seo
  • 咸寧市住房和城鄉(xiāng)建設委員會網站/數字營銷策劃
  • 給網站平臺做推廣叫什么/產品推廣平臺
  • 門戶網站源碼入駐/站長之家收錄查詢
  • 國外b2b網站是什么意思/百度指數官網
  • 網站做支付需要準備什么東西嗎/seo技術培訓唐山
  • 哪一個景區(qū)網站做的最成熟/營銷的手段和方法
  • 網站后臺管理怎么做/德陽seo
  • 安卓軟件開發(fā)app/優(yōu)化關鍵詞的方法包括
  • 指紋鎖在什么網站做宣傳好/注冊網址
  • 如何查看網站空間大小/個人發(fā)布信息免費推廣平臺
  • 加強政府網站建設的總結/西安seo代運營
  • 有做瀏覽單的網站/百度小說風云榜2022
  • 如何建設英文網站/淘寶店鋪買賣交易平臺
  • 開一個網站建設公司/it培訓四個月騙局
  • 廊坊市做網站/贛州seo排名
  • 手機商城網站開發(fā)/seo流量的提升的軟件
  • 做澳洲外貿的網站有哪些/港港網app下載最新版