国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++實(shí)現(xiàn)websocket兩server兩client半雙工通信(基于boost!!!)

這篇具有很好參考價(jià)值的文章主要介紹了C++實(shí)現(xiàn)websocket兩server兩client半雙工通信(基于boost?。?!)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??自身環(huán)境:ubuntu18.04+gcc7.5.0+boost1.7,3

環(huán)境配置

??gcc或者g++一般都有,這里主要介紹一下boost的配置方法
??執(zhí)行如下代碼:

wget https://boostorg.jfrog.io/artifactory/main/release/1.73.0/source/boost_1_73_0.tar.bz2 --no-check-certificate
tar xvf boost_1_73_0.tar.bz2
cd boost_1_73_0
./bootstrap.sh --prefix=/usr 
./b2 
sudo ./b2 install
cat /usr/include/boost/version.hpp | grep "BOOST_LIB_VERSION"

??裝完后發(fā)現(xiàn)還是會(huì)報(bào)錯(cuò):#include <boost/beast/core.hpp> no such file
??這個(gè)時(shí)候再加一個(gè):

sudo apt-get install libboost-all-dev

??然后編譯執(zhí)行代碼就可以了,在這里說明下我不太確定是否要執(zhí)行那個(gè)apt-get,理論上前面是源碼編譯就沒問題了,后面估計(jì)是默認(rèn)庫的安裝,但是我當(dāng)時(shí)沒太注意順序,兩個(gè)都做了一下才成功、
boost安裝參考:https://blog.csdn.net/HandsomeHong/article/details/128813619

??順道提一下Linux下查看boost的版本方法:文章來源地址http://www.zghlxwxcb.cn/news/detail-516899.html

dpkg -S /usr/include/boost/version.hpp

示例源碼

客戶端——client.h

#ifndef WEBSOCKET_CLIENT_H
#define WEBSOCKET_CLIENT_H
#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <cstdlib>
#include <functional>
#include <iostream>
#include <string>
#include <thread>
#include <codecvt>
#include <wchar.h>
#include <locale.h>
#include <stdlib.h>

namespace beast = boost::beast;         // from <boost/beast.hpp>
namespace http = beast::http;           // from <boost/beast/http.hpp>
namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
namespace net = boost::asio;            // from <boost/asio.hpp>
using tcp = boost::asio::ip::tcp;       // from <boost/asio/ip/tcp.hpp>

class Client {
    public:
        static std::wstring string_to_wstring(const std::string& str);
        static std::string wstring_to_string(const std::wstring& ws);
        static std::string ansi_to_utf8(const std::string& s);
        static std::string utf8_to_ansi(const std::string& s);
        static void connect(std::string IP, const char *port_s);
        static void send(std::string message);
        static void listen(std::string &out);
        static void disconnect();
};
    
#endif

客戶端——client.cpp

#include "client.h"

namespace beast = boost::beast;         // from <boost/beast.hpp>
namespace http = beast::http;           // from <boost/beast/http.hpp>
namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
namespace net = boost::asio;            // from <boost/asio.hpp>
using tcp = boost::asio::ip::tcp;       // from <boost/asio/ip/tcp.hpp>

net::io_context ioc;
tcp::resolver resolver{ ioc };
websocket::stream<tcp::socket> ws{ ioc };

std::wstring Client::string_to_wstring(const std::string& str) {
    std::wstring r;
    const char *source = str.c_str();
    wchar_t *dest = NULL;
    int len = 0;
    int ret = 0;
    len = strlen(source) + 1;
    if(len <= 1)
        return 0;
    dest = new wchar_t[len];
    ret = mbstowcs(dest, source, len);
    r = std::wstring(dest);
    delete[] dest;
	return r;
}

std::string Client::wstring_to_string(const std::wstring& ws) {
    std::string r = "";
    const wchar_t *source = ws.c_str();
    char *dest = NULL;
    int len = 0;
    int ret = 0;
    len = wcslen(source) + 1;
    if(len <= 1)
        return 0;
    dest = new char[len*sizeof(wchar_t)];
    ret = wcstombs(dest, source, len*sizeof(wchar_t));
    r = std::string(dest);
    delete[] dest;
	return r;
}

std::string Client::ansi_to_utf8(const std::string& s) {
    static std::wstring_convert<std::codecvt_utf8<wchar_t> > conv;
	return conv.to_bytes(string_to_wstring(s));
}

std::string Client::utf8_to_ansi(const std::string& s) {
    static std::wstring_convert<std::codecvt_utf8<wchar_t> > conv;
	return wstring_to_string(conv.from_bytes(s));
}

void Client::connect(std::string IP, const char *port_s) {
	try {
        auto const address = net::ip::make_address(IP); //服務(wù)器地址
        auto const port = static_cast<unsigned short>(std::atoi(port_s));//服務(wù)器端口號(hào)
        tcp::endpoint endpoint{ address, port };
        auto const results = resolver.resolve(endpoint);
        // 在我們從查找中獲得的IP地址上建立連接
        net::connect(ws.next_layer(), results.begin(), results.end());
        ws.set_option(websocket::stream_base::decorator(
            [](websocket::request_type& req)
        {
            req.set(http::field::user_agent,
                std::string(BOOST_BEAST_VERSION_STRING) +
                " websocket-client-coro");
        }));
        std::cout << "The port is:" << port_s << std::endl;
        ws.handshake(IP, "/"); //發(fā)送握手消息
        std::cout << "The port:" << port_s << " finish!" << std::endl;
    }	
    catch (std::exception const& e)
	{
		std::cerr << "Error: " << e.what() << std::endl;
		return  ;
	}
}

void Client::send(std::string message) {
    while (1) {
        //std::cout << "log:" << message << std::endl;
        ws.write(net::buffer(ansi_to_utf8(message)));
        sleep(1);
    }
}

void Client::listen(std::string &out) {
    while (1) {
        beast::flat_buffer buffer;//創(chuàng)建一個(gè)緩沖區(qū)用于存放接收到的消息	
	    ws.read(buffer);// 讀取一條消息到緩沖區(qū)
	    out = beast::buffers_to_string(buffer.cdata());
	    //std::cout << utf8_to_ansi(out) << std::endl; //輸出消息到控制臺(tái)顯示
    }
}

void Client::disconnect() {
    ws.close(websocket::close_code::normal);// 關(guān)閉WebSocket連接
}

服務(wù)端——server.h

#ifndef WEBSOCKET_SERVER_H
#define WEBSOCKET_SERVER_H
#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <cstdlib>
#include <functional>
#include <iostream>
#include <thread>
#include <codecvt>
#include <wchar.h>
#include <locale.h>
namespace beast = boost::beast;         // from <boost/beast.hpp>
namespace http = beast::http;           // from <boost/beast/http.hpp>
namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
namespace net = boost::asio;            // from <boost/asio.hpp>
using tcp = boost::asio::ip::tcp;       // from <boost/asio/ip/tcp.hpp>

class Server {
    public:
        static std::wstring string_to_wstring(const std::string& str);
        static std::string wstring_to_string(const std::wstring& ws);
        static std::string ansi_to_utf8(const std::string& s);
        static std::string utf8_to_ansi(const std::string& s);
        static void do_session(tcp::socket& socket, tcp::socket& socket1);
        static void initlization(std::string IP);
        static void initlization1(std::string IP);
};
#endif

服務(wù)端——server.cpp

#include "server.h"

std::wstring Server::string_to_wstring(const std::string& str) {
    std::wstring r;
    const char *source = str.c_str();
    wchar_t *dest = NULL;
    int len = 0;
    int ret = 0;
    len = strlen(source) + 1;
    if(len <= 1)
        return 0;
    dest = new wchar_t[len];
    ret = mbstowcs(dest, source, len);
    r = std::wstring(dest);
    delete[] dest;
	return r;
}

std::string Server::wstring_to_string(const std::wstring& ws) {
    std::string r = "";
    const wchar_t *source = ws.c_str();
    char *dest = NULL;
    int len = 0;
    int ret = 0;
    len = wcslen(source) + 1;
    if(len <= 1)
        return 0;
    dest = new char[len*sizeof(wchar_t)];
    ret = wcstombs(dest, source, len*sizeof(wchar_t));
    r = std::string(dest);
    delete[] dest;
	return r;
}

std::string Server::ansi_to_utf8(const std::string& s) {
    static std::wstring_convert<std::codecvt_utf8<wchar_t> > conv;
	return conv.to_bytes(string_to_wstring(s));
}

std::string Server::utf8_to_ansi(const std::string& s) {
    static std::wstring_convert<std::codecvt_utf8<wchar_t> > conv;
	return wstring_to_string(conv.from_bytes(s));
}

// socket 20000  socket1 19999
void Server::do_session(tcp::socket& socket, tcp::socket& socket1) {
    try
	{
		websocket::stream<tcp::socket> ws{ std::move(socket) };
		ws.set_option(websocket::stream_base::decorator(
			[](websocket::response_type& res)
		{
			res.set(http::field::server,
				std::string(BOOST_BEAST_VERSION_STRING) +
				" websocket-server-sync");
		}));
		websocket::stream<tcp::socket> ws1{ std::move(socket1) };
		ws1.set_option(websocket::stream_base::decorator(
			[](websocket::response_type& res)
		{
			res.set(http::field::server,
				std::string(BOOST_BEAST_VERSION_STRING) +
				" websocket-server-sync");
		}));
		ws.accept();//等待客戶端連接
		ws1.accept();
		for (;;)
		{
			beast::flat_buffer buffer;// 這個(gè)緩沖區(qū)將保存?zhèn)魅氲南?/span>
			ws.read(buffer);// 讀取一條消息
			auto out = beast::buffers_to_string(buffer.cdata());
			if (out != "") {
				ws1.write(net::buffer(ansi_to_utf8(out)));// 發(fā)送消息
			}
			sleep(1); //等待1秒
		}
	}
	catch (beast::system_error const& se)
	{
		if (se.code() != websocket::error::closed)
			std::cerr << "Error: " << se.code().message() << std::endl;
	}
	catch (std::exception const& e)
	{
		std::cerr << "Error: " << e.what() << std::endl;
	}
}
// socket 19999  socket1 20000
// void Server::do_session1(tcp::socket& socket, tcp::socket& socket1) {
//     try
// 	{
// 		websocket::stream<tcp::socket> ws{ std::move(socket) };
// 		ws.set_option(websocket::stream_base::decorator(
// 			[](websocket::response_type& res)
// 		{
// 			res.set(http::field::server,
// 				std::string(BOOST_BEAST_VERSION_STRING) +
// 				" websocket-server-sync");
// 		}));
// 		websocket::stream<tcp::socket> ws1{ std::move(socket1) };
// 		ws1.set_option(websocket::stream_base::decorator(
// 			[](websocket::response_type& res)
// 		{
// 			res.set(http::field::server,
// 				std::string(BOOST_BEAST_VERSION_STRING) +
// 				" websocket-server-sync");
// 		}));
// 		ws.accept();//等待客戶端連接
// 		ws1.accept();
// 		for (;;)
// 		{
// 			beast::flat_buffer buffer;// 這個(gè)緩沖區(qū)將保存?zhèn)魅氲南?/span>
// 			ws.read(buffer);// 讀取一條消息
// 			auto out = beast::buffers_to_string(buffer.cdata());
// 			if (out != "") {
// 				ws1.write(net::buffer(ansi_to_utf8(out)));// 發(fā)送消息
// 			}
// 			sleep(1); //等待1秒
// 		}
// 	}
// 	catch (beast::system_error const& se)
// 	{
// 		if (se.code() != websocket::error::closed)
// 			std::cerr << "Error: " << se.code().message() << std::endl;
// 	}
// 	catch (std::exception const& e)
// 	{
// 		std::cerr << "Error: " << e.what() << std::endl;
// 	}
// }

void Server::initlization(std::string IP) {
	try
	{
		auto const address = net::ip::make_address(IP);//綁定ip地址
		auto const port = static_cast<unsigned short>(std::atoi("20000"));//綁定端口號(hào)
		net::io_context ioc{ 1 };
		tcp::acceptor acceptor{ ioc,{ address, port } };
		auto const address1 = net::ip::make_address(IP);//綁定ip地址
		auto const port1 = static_cast<unsigned short>(std::atoi("19999"));//綁定端口號(hào)
		tcp::acceptor acceptor1{ ioc,{ address1, port1 } };
		for (;;)
		{
			tcp::socket socket{ ioc };
			acceptor.accept(socket);
			tcp::socket socket1{ ioc };
			acceptor1.accept(socket1);
			// 開啟線程等待客戶端的連接請(qǐng)求
			std::thread{ std::bind(&do_session,std::move(socket), std::move(socket1)) }.detach();
		}
	}
	catch (const std::exception & e) {
		std::cerr << "Error: " << e.what() << std::endl;
		return ;
	}
}

void Server::initlization1(std::string IP) {
	try
	{
		auto const address = net::ip::make_address(IP);//綁定ip地址
		auto const port = static_cast<unsigned short>(std::atoi("8888"));//綁定端口號(hào)
		net::io_context ioc{ 1 };
		tcp::acceptor acceptor{ ioc,{ address, port } };
		auto const address1 = net::ip::make_address(IP);//綁定ip地址
		auto const port1 = static_cast<unsigned short>(std::atoi("7777"));//綁定端口號(hào)
		tcp::acceptor acceptor1{ ioc,{ address1, port1 } };
		for (;;)
		{
			tcp::socket socket{ ioc };
			acceptor.accept(socket);
			tcp::socket socket1{ ioc };
			acceptor1.accept(socket1);
			// 開啟線程等待客戶端的連接請(qǐng)求
			std::thread{ std::bind(&do_session,std::move(socket), std::move(socket1)) }.detach();
		}
	}
	catch (const std::exception & e) {
		std::cerr << "Error: " << e.what() << std::endl;
		return ;
	}
}

客戶端調(diào)用——客戶1

#include "client.h"

Client client1_listen;
Client client1_send;
std::string listen_message = "";
std::string IP_server("192.168.1.116");
std::string send_message("client1 to client2");
const char *port_client1_send = "20000";
const char *port_client1_listen = "7777";

void listenThread() {
    client1_listen.connect(IP_server, port_client1_listen);  
    client1_listen.listen(listen_message);
}

void sendThread() {
    client1_send.connect(IP_server, port_client1_send);
    client1_send.send(send_message);
}

void outputThread() {
    while (1) {
        if (listen_message != "") {
            std::cout << listen_message << std::endl;
        }
        sleep(1);
    }
}

int main() { 
    std::thread sendThreadObj(sendThread);
    std::thread listenThreadObj(listenThread);
    std::thread outputThreadObj(outputThread);
    listenThreadObj.join();
    sendThreadObj.join();
    outputThreadObj.join();
    return 0;
}

客戶端調(diào)用——客戶2

#include "client.h"

Client client2_listen;
Client client2_send;
std::string listen_message = "";
std::string send_message("client2 to client1");
std::string IP_server("192.168.1.116");
const char *port_client2_send = "8888";
const char *port_client2_listen = "19999";

void listenThread() {
    client2_listen.connect(IP_server, port_client2_listen); 
    client2_listen.listen(listen_message);
}

void sendThread() {
    client2_send.connect(IP_server, port_client2_send);
    client2_send.send(send_message);
}

void outputThread() {
    while (1) {
        if (listen_message != "") {
            std::cout << listen_message << std::endl;
        }
        sleep(1);
    }
}

int main() { 
    std::thread sendThreadObj(sendThread);
    std::thread listenThreadObj(listenThread);
    std::thread outputThreadObj(outputThread);
    listenThreadObj.join();
    sendThreadObj.join();
    outputThreadObj.join();
    return 0;
}

服務(wù)端調(diào)用——服務(wù)1

#include "server.h"
#include <iostream>
#include <thread>

// 20000      19999
int main() {
    Server server;
    std::string IP("192.168.1.116");
    server.initlization(IP);
    return 0;
}

服務(wù)端調(diào)用——服務(wù)2

#include "server.h"
#include <iostream>
#include <thread>

// 18888 17777
int main() {
    Server server;
    std::string IP("192.168.1.116");
    server.initlization1(IP);
    return 0;
}

操作命令

g++ main_client1.cpp client.cpp client.h -o client1 -std=c++11 -lpthread
g++ main_client2.cpp client.cpp client.h -o client2 -std=c++11 -lpthread

g++ main_server.cpp server.cpp server.h -o server -std=c++11 -lpthread
g++ main_server1.cpp server.cpp server.h -o server1 -std=c++11 -lpthread

必須先server再client
./server
./server1
./client1
./client2

server:端口20000發(fā)  端口19999收
server1:端口8888發(fā)  端口7777

到了這里,關(guān)于C++實(shí)現(xiàn)websocket兩server兩client半雙工通信(基于boost!??!)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Redis的實(shí)現(xiàn)一:c、c++的網(wǎng)絡(luò)通信編程技術(shù),先實(shí)現(xiàn)server和client的通信

    由于,本人是主修java的,所以以下內(nèi)容可能不是很精通,各位看完后盡可評(píng)論。 以下皆是在linux的描述 Socket()函數(shù) :創(chuàng)建用于通信的端點(diǎn)并返回描述符。 它的第一個(gè)參數(shù) 便是通信域,這里我舉出常用的。 AF_INET是ipv4的。 AF_INET6是ipv6的。 它的第二個(gè)參數(shù) 便是套接字具有指定

    2024年01月16日
    瀏覽(28)
  • 全雙工通信協(xié)議:WebSockets+STOMP

    全雙工通信協(xié)議:WebSockets+STOMP

    WebSocket 協(xié)議定義了兩種類型的消息(文本和二進(jìn)制),但是它們的內(nèi)容是未定義的。 STOMP (Streaming Text Oriented Messaging Protocol)是一種簡單的、基于文本的消息傳遞協(xié)議,提供了一組命令和消息格式,用于在客戶端和服務(wù)端之間發(fā)送和接收消息。客戶端可以通過連接到消息代理(

    2024年02月20日
    瀏覽(17)
  • websocket實(shí)現(xiàn)go(server)與c#(client)通訊

    websocket實(shí)現(xiàn)go(server)與c#(client)通訊

    使用到github.com/gorilla/websocket C#操作websocket當(dāng)客戶端使用時(shí)使用 System.Net.Websockets 這個(gè)命名空間下的 ClientWebSocket 類 winform的設(shè)計(jì)界面如下: 代碼如下: 注意:無論是客戶端斷開還是服務(wù)端斷開,如果正在讀取消息,則會(huì)觸發(fā)錯(cuò)誤。利用此機(jī)制可以很方便的處理重連問題。

    2024年02月06日
    瀏覽(18)
  • 使用 PHP WorkerMan 構(gòu)建 WebSocket 全雙工群聊通信(二)

    在很早很早以前,WebSocket 協(xié)議還沒有被發(fā)明的時(shí)候,人們?cè)?Web 端制作類實(shí)時(shí)數(shù)據(jù)動(dòng)態(tài)更新時(shí),一般采用輪詢、 長連接 (Long Polling) 來實(shí)現(xiàn)。大概就是: 輪詢:客戶端不停發(fā)送 HTTP 請(qǐng)求給服務(wù)端,服務(wù)端返回最新數(shù)據(jù) 長連接:客戶端發(fā)送一條 HTTP 請(qǐng)求給服務(wù)端,服務(wù)端 HOLD

    2024年02月09日
    瀏覽(23)
  • UNIX網(wǎng)絡(luò)編程:socket實(shí)現(xiàn)client/server通信

    UNIX網(wǎng)絡(luò)編程:socket實(shí)現(xiàn)client/server通信

    閱讀 UNIX網(wǎng)絡(luò)編程 卷1:套接字聯(lián)網(wǎng)API 第3版 的前4個(gè)章節(jié),覺得有必要對(duì)書籍上的源碼案例進(jìn)行復(fù)現(xiàn),并推敲TCP的C/S通信過程。 ?? 測試環(huán)境:CentOS7.6 x64 編譯server.c 和 client.c gcc server.c -g -std=gnu99 -o server 和 gcc client.c -g -std=gnu99 -o client 運(yùn)行測試: ?? server.c僅僅實(shí)現(xiàn)對(duì)單個(gè)客戶

    2024年02月06日
    瀏覽(24)
  • Linux網(wǎng)絡(luò)編程:socket實(shí)現(xiàn)client/server通信

    Linux網(wǎng)絡(luò)編程:socket實(shí)現(xiàn)client/server通信

    閱讀 UNIX網(wǎng)絡(luò)編程 卷1:套接字聯(lián)網(wǎng)API 第3版 的前4個(gè)章節(jié),覺得有必要對(duì)書籍上的源碼案例進(jìn)行復(fù)現(xiàn),并推敲TCP的C/S通信過程。 ?? 測試環(huán)境:CentOS7.6 x64 編譯server.c 和 client.c gcc server.c -g -std=gnu99 -o server 和 gcc client.c -g -std=gnu99 -o client 運(yùn)行測試: ?? server.c僅僅實(shí)現(xiàn)對(duì)單個(gè)客戶

    2024年02月03日
    瀏覽(20)
  • Linux網(wǎng)絡(luò)編程:socket & fork實(shí)現(xiàn)clients/server通信

    Linux網(wǎng)絡(luò)編程:socket & fork實(shí)現(xiàn)clients/server通信

    UNIX網(wǎng)絡(luò)編程:socket實(shí)現(xiàn)client/server通信 隨筆簡單介紹了TCP Server服務(wù)單客戶端的socket通信,但是并未涉及多客戶端通信。 對(duì)于網(wǎng)絡(luò)編程肯定涉及到多客戶端通信和并發(fā)編程 (指在同時(shí)有大量的客戶鏈接到同一服務(wù)器),故本隨筆補(bǔ)充這部分知識(shí)。 而且并發(fā)并發(fā)編程涉及到多進(jìn)程

    2024年02月05日
    瀏覽(21)
  • C++畢業(yè)設(shè)計(jì)——基于 C+++TCP+Websocket的即時(shí)通信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)(畢業(yè)論文+程序源碼)——即時(shí)通信系統(tǒng)

    C++畢業(yè)設(shè)計(jì)——基于 C+++TCP+Websocket的即時(shí)通信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)(畢業(yè)論文+程序源碼)——即時(shí)通信系統(tǒng)

    大家好,今天給大家介紹基于 C+++TCP+Websocket的即時(shí)通信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn),文章末尾附有本畢業(yè)設(shè)計(jì)的論文和源碼下載地址哦。需要下載開題報(bào)告PPT模板及論文答辯PPT模板等的小伙伴,可以進(jìn)入我的博客主頁查看左側(cè)最下面欄目中的自助下載方法哦 文章目錄: 隨著網(wǎng)絡(luò)通信和

    2024年02月08日
    瀏覽(20)
  • Linux網(wǎng)絡(luò)編程:socket & fork()多進(jìn)程 實(shí)現(xiàn)clients/server通信

    Linux網(wǎng)絡(luò)編程:socket & fork()多進(jìn)程 實(shí)現(xiàn)clients/server通信

    UNIX網(wǎng)絡(luò)編程:socket實(shí)現(xiàn)client/server通信 隨筆簡單介紹了TCP Server服務(wù)單客戶端的socket通信,但是并未涉及多客戶端通信。 對(duì)于網(wǎng)絡(luò)編程肯定涉及到多客戶端通信和并發(fā)編程 (指在同時(shí)有大量的客戶鏈接到同一服務(wù)器),故本隨筆補(bǔ)充這部分知識(shí)。 而且并發(fā)并發(fā)編程涉及到多進(jìn)程

    2024年02月05日
    瀏覽(28)
  • UNIX網(wǎng)絡(luò)編程:socket & fork()多進(jìn)程 實(shí)現(xiàn)clients/server通信

    UNIX網(wǎng)絡(luò)編程:socket & fork()多進(jìn)程 實(shí)現(xiàn)clients/server通信

    UNIX網(wǎng)絡(luò)編程:socket實(shí)現(xiàn)client/server通信 隨筆簡單介紹了TCP Server服務(wù)單客戶端的socket通信,但是并未涉及多客戶端通信。 對(duì)于網(wǎng)絡(luò)編程肯定涉及到多客戶端通信和并發(fā)編程 (指在同時(shí)有大量的客戶鏈接到同一服務(wù)器),故本隨筆補(bǔ)充這部分知識(shí)。 而且并發(fā)并發(fā)編程涉及到多進(jìn)程

    2024年02月06日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包