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

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

這篇具有很好參考價值的文章主要介紹了簡單的TCP網(wǎng)絡程序·單進程(后端服務器)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

文件1:tcpServer.cc

文件2:tcpServer.hpp

1.提出日志概念 -- 在后續(xù)完善

日志格式 --?暫定簡單的打印功能

2.創(chuàng)建套接字

SOCK_STREAM -- socket參數(shù)

3.bind自己的套接字

4.設(shè)置socket 為監(jiān)聽狀態(tài) *

新接口1:listen

函數(shù)1:initServer()

新接口2:accept *

接口1:read

接口2:write

文件描述符本質(zhì)是數(shù)組下標 -- 有限

ulimit -- 查看本機可以開多少個文件描述符

函數(shù)2:serviceIO()

至此基本的功能完成 -- 測試1

準備工作

文件3:tcpClient.cc

文件4:tcpClient.hpp

函數(shù)3:initClient()

新接口3:connect *

函數(shù)4:start()

至此TCP通信的功能完成 -- 測試2

全部代碼

log.hpp

makefile

tcpClient.cc

tcpClient.hpp

tcpServer.cc

tcpServer.hpp


直接代碼開整

文件1:tcpServer.cc

準備階段 -- 目前和UDP是一樣的

#include "tcpServer.hpp"
#include <memory>

using namespace std;
using namespace server;

static void Usage(string proc)
{
    cout << "Usage:\n\t" << proc << " local_port\n\n"; // 命令提示符
}

// tcp服務器,啟動和 udp server 一模一樣
// ./tcpserver lock_port
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        Usage(argv[0]);
        exit(USAGE_ERR);
    }
    uint16_t port = atoi(argv[1]);

    unique_ptr<TcpServer> tsvr(new TcpServer());
    tsvr->initServer();
    tsvr->start();
     
    return 0;
}

文件2:tcpServer.hpp

1.提出日志概念 -- 在后續(xù)完善

日志格式 --?暫定簡單的打印功能

這個日志在后序完善TCP之后再進行修改,現(xiàn)在只實現(xiàn)簡單的打印功能

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

2.創(chuàng)建套接字

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

SOCK_STREAM -- socket參數(shù)

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

3.bind自己的套接字

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

????????這里有個細節(jié),我們會發(fā)現(xiàn)當我們接受數(shù)據(jù)的時候是不需要主機轉(zhuǎn)網(wǎng)路序列的,因為關(guān)于IO類的接口,內(nèi)部都幫我們實現(xiàn)了這一功能,這里不幫我們做是因為我們傳入的是一個結(jié)構(gòu)體,系統(tǒng)做不到

4.設(shè)置socket 為監(jiān)聽狀態(tài) *

新接口1:listen

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

底層鏈接的長度+1,先不管他,在后序講原理再講述

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

函數(shù)1:initServer()

        void initServer()
        {
            // 1. 創(chuàng)建socket文件套接字對象 -- 流式套接字
            _sock = socket(AF_INET, SOCK_STREAM, 0); // 第三個參數(shù)默認 0
            if (_sock < 0)
            {
                logMessage(FATAL, "create socket error");
                exit(SOCKET_ERR);
            }
            logMessage(NORMAL, "create socket success");

            // 2.bind綁定自己的網(wǎng)路信息 -- 注意包含頭文件
            struct sockaddr_in local;
            memset(&local, 0, sizeof(local));
            local.sin_family = AF_INET;
            local.sin_port = htons(_port);      // 這里有個細節(jié),我們會發(fā)現(xiàn)當我們接受數(shù)據(jù)的時候是不需要主機轉(zhuǎn)網(wǎng)路序列的,因為關(guān)于IO類的接口,內(nèi)部都幫我們實現(xiàn)了這一功能,這里不幫我們做是因為我們傳入的是一個結(jié)構(gòu)體,系統(tǒng)做不到
            local.sin_addr.s_addr = INADDR_ANY; // 接受任意ip地址
            if (bind(_sock, (struct sockaddr *)&local, sizeof(local)) < 0)
            {
                logMessage(FATAL, "bind socket error");
                exit(BIND_ERR);
            }
            logMessage(NORMAL, "bind socket success");

            // 3. 設(shè)置socket 為監(jiān)聽狀態(tài) -- TCP與UDP不同,它先要建立鏈接之后,TCP是面向鏈接的,后面還會有“握手”過程
            if (listen(_sock, gbacklog) < 0) // 第二個參數(shù)backlog后面再填這個坑
            {
                logMessage(FATAL, "listen socket error");
                exit(LISTEN_ERR);
            }
            logMessage(FATAL, "listen socket success");
        }

注意這里是起始版本,在認識下面的一個接口的時候,需要整改

新接口2:accept *

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

? ? ? ? 一個比喻:就像一家飯店的門口招呼人的張三,當張三從外邊招呼人進來的時候,就向飯店里面喊人,讓李四去服務客人,但是張三不會進來,又返回去在門口拉客

? ? ? ? 因為隨著客戶端的不斷增多,TCP服務器上可能存在多個套接字,就像飯店里面會有多個客人有多個服務員

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

至此我們需要把之前的_sock 修改為 _listensock

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

至此我們獲取的sock就是一個文件操作符,可以使用文件操作類的函數(shù)進行處理,例如read之類的

接口1:read

從一個文件描述符中讀取

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

接口2:write

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

文件描述符本質(zhì)是數(shù)組下標 -- 有限

ulimit -- 查看本機可以開多少個文件描述符

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

函數(shù)2:serviceIO()

        void serviceIO(int sock)
        {
            // 先用最簡單的,讀取再寫回去
            char buffer[1024];
            while (true)
            {
                ssize_t n = read(sock, buffer, sizeof(buffer) - 1);
                if (n > 0)
                {
                    // 截至目前,我們把讀到的數(shù)據(jù)當作字符串
                    buffer[n] = 0;
                    std::cout << "recv message: " << buffer << std::endl;

                    std::string outbuffer = buffer;
                    outbuffer += "server[echo]";

                    write(sock, outbuffer.c_str(), outbuffer.size()); // 在多路轉(zhuǎn)接的時候再詳談write的返回值
                }
                else if(n == 0)
                {
                    // 代表client退出 -- 把它想象成一個建立好的管道,客戶端不寫了,并且把它的文件描述符關(guān)了,讀端就會像管道一樣讀到 0 TCP同理
                    logMessage(NORMAL, "client quit, me too!");
                }
            }
        }

至此基本的功能完成 -- 測試1

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

準備工作

文件3:tcpClient.cc

調(diào)用邏輯?

#include "tcpClient.hpp"
#include <memory>

using namespace std;

static void Usage(string proc)
{
    cout << "Usage:\n\t" << proc << " serverip serverport\n\n"; // 命令提示符
}

// ./tcpclient serverip serverport  調(diào)用邏輯
int main(int argc, char *argv[])
{
    if(argc != 3)
    {
        Usage(argv[0]);
        exit(1);
    }
    string serverip = argv[1];
    uint16_t serverport = atoi(argv[2]);

    unique_ptr<TcpClient> tcli(new TcpClient(serverip, serverport));
    tcli->initClient();
    tcli->start();

    return 0;
}

文件4:tcpClient.hpp

函數(shù)3:initClient()

    void initClient()
    {
        // 1. 創(chuàng)建socket
        _sock = socket(AF_INET, SOCK_STREAM, 0);
        if (_sock < 0)
        {
            // 客戶端也可以有日志,不過這里就不再實現(xiàn)了,直接打印錯誤
            std::cout << "socket create error" << std::endl;
            exit(2);
        }

        // 2. tcp的客戶端要不要bind? 要的! 但是不需要顯示bind,這里的client port要讓OS自定!
        // 3. 要不要listen? -- 不需要!客戶端不需要建立鏈接
        // 4. 要不要accept? -- 不要!
        // 5. 要什么? 要發(fā)起鏈接!
    }

新接口3:connect *

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

函數(shù)4:start()

 void start()
    {
        struct sockaddr_in server;
        memset(&server, 0, sizeof(server));
        server.sin_family = AF_INET;
        server.sin_port = htons(_serverport);
        server.sin_addr.s_addr = inet_addr(_serverip.c_str());

        if (connect(_sock, (struct sockaddr *)&server, sizeof(server)) != 0)
        {
            std::cerr << "socket connect error" << std::endl;
        }
        else
        {
            std::string msg;
            while (true)
            {
                std::cout << "Enter# ";
                std::getline(std::cin, msg);
                write(_sock, msg.c_str(), msg.size());

                char buffer[NUM];
                int n = read(_sock, buffer, sizeof(buffer) - 1);
                if (n > 0)
                {
                    // 目前我們把讀到的數(shù)據(jù)當成字符串, 截至目前
                    buffer[n] = 0;
                    std::cout << "Server回顯# " << buffer << std::endl;
                }
                else
                {
                    break;
                }
            }
        }
    }

至此TCP通信的功能完成 -- 測試2

????????但是至此,我們所寫的不過是一個單進程版的,所以會出現(xiàn)下面的情況,后續(xù)需要進一步修改成為多進程形式的

簡單的TCP網(wǎng)絡程序·單進程(后端服務器)

全部代碼

log.hpp

#pragma once

#include <iostream>
#include <string>

// 定義五種不同的信息
#define DEBUG 0
#define NORMAL 1
#define WARNING 2
#define ERROR 3     //一種不影響服務器的錯誤
#define FATAL 4     //致命錯誤

void logMessage(int level, const std::string message)
{
    // 格式如下
    // [日志等級] [時間戳/時間] [pid] [message]
    // [FATAL0] [2023-06-11 16:46:07] [123] [創(chuàng)建套接字失敗]

    // 暫定
    std::cout << message << std::endl;
}

makefile

cc=g++
.PHONY:all
all:tcpserver tcpclient

tcpclient:tcpClient.cc
	$(cc) -o $@ $^ -std=c++11

tcpserver:tcpServer.cc
	$(cc) -o $@ $^ -std=c++11
 
.PHONY:clean
clean:
	rm -f tcpserver tcpclient

tcpClient.cc

#include "tcpClient.hpp"
#include <memory>

using namespace std;

static void Usage(string proc)
{
    cout << "Usage:\n\t" << proc << " serverip serverport\n\n"; // 命令提示符
}

// ./tcpclient serverip serverport  調(diào)用邏輯
int main(int argc, char *argv[])
{
    if(argc != 3)
    {
        Usage(argv[0]);
        exit(1);
    }
    string serverip = argv[1];
    uint16_t serverport = atoi(argv[2]);

    unique_ptr<TcpClient> tcli(new TcpClient(serverip, serverport));
    tcli->initClient();
    tcli->start();

    return 0;
}

tcpClient.hpp

#pragma once

#include <iostream>
#include <string>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define NUM 1024

class TcpClient
{
public:
    TcpClient(const std::string &serverip, const uint16_t &port)
        : _sock(1), _serverip(serverip), _serverport(port)
    {
    }
    void initClient()
    {
        // 1. 創(chuàng)建socket
        _sock = socket(AF_INET, SOCK_STREAM, 0);
        if (_sock < 0)
        {
            // 客戶端也可以有日志,不過這里就不再實現(xiàn)了,直接打印錯誤
            std::cout << "socket create error" << std::endl;
            exit(2);
        }

        // 2. tcp的客戶端要不要bind? 要的! 但是不需要顯示bind,這里的client port要讓OS自定!
        // 3. 要不要listen? -- 不需要!客戶端不需要建立鏈接
        // 4. 要不要accept? -- 不要!
        // 5. 要什么? 要發(fā)起鏈接!
    }

    void start()
    {
        struct sockaddr_in server;
        memset(&server, 0, sizeof(server));
        server.sin_family = AF_INET;
        server.sin_port = htons(_serverport);
        server.sin_addr.s_addr = inet_addr(_serverip.c_str());

        if (connect(_sock, (struct sockaddr *)&server, sizeof(server)) != 0)
        {
            std::cerr << "socket connect error" << std::endl;
        }
        else
        {
            std::string msg;
            while (true)
            {
                std::cout << "Enter# ";
                std::getline(std::cin, msg);
                write(_sock, msg.c_str(), msg.size());

                char buffer[NUM];
                int n = read(_sock, buffer, sizeof(buffer) - 1);
                if (n > 0)
                {
                    // 目前我們把讀到的數(shù)據(jù)當成字符串, 截至目前
                    buffer[n] = 0;
                    std::cout << "Server回顯# " << buffer << std::endl;
                }
                else
                {
                    break;
                }
            }
        }
    }
    ~TcpClient()
    {
        if(_sock >= 0) close(_sock);    //不寫也行,因為文件描述符的生命周期隨進程,所以進程退了,自然也就會自動回收了
    }

private:
    int _sock;
    std::string _serverip;
    uint16_t _serverport;
};

tcpServer.cc

#include "tcpServer.hpp"
#include <memory>

using namespace server;
using namespace std;

static void Usage(string proc)
{
    cout << "Usage:\n\t" << proc << " local_port\n\n"; // 命令提示符
}

// tcp服務器,啟動上和udp server一模一樣
// ./tcpserver local_port
int main(int argc, char *argv[])
{ 
    if (argc != 2)
    {
        Usage(argv[0]);
        exit(USAGE_ERR);
    }
    uint16_t port = atoi(argv[1]);

    unique_ptr<TcpServer> tsvr(new TcpServer(port));
    tsvr->initServer();
    tsvr->start();

    return 0;
}

tcpServer.hpp

#pragma once

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include "log.hpp"

namespace server
{
    enum
    {
        USAGE_ERR = 1,
        SOCKET_ERR,
        BIND_ERR,
        LISTEN_ERR

    };

    static const uint16_t gport = 8080;
    static const int gbacklog = 5; // 10、20、50都可以,但是不要太大比如5千,5萬

    class TcpServer
    {
    public:
        TcpServer(const uint16_t &port = gport) : _listensock(-1), _port(port)
        {
        }
        void initServer()
        {
            // 1. 創(chuàng)建socket文件套接字對象 -- 流式套接字
            _listensock = socket(AF_INET, SOCK_STREAM, 0); // 第三個參數(shù)默認 0
            if (_listensock < 0)
            {
                logMessage(FATAL, "create socket error");
                exit(SOCKET_ERR);
            }
            logMessage(NORMAL, "create socket success");

            // 2.bind綁定自己的網(wǎng)路信息 -- 注意包含頭文件
            struct sockaddr_in local;
            memset(&local, 0, sizeof(local));
            local.sin_family = AF_INET;
            local.sin_port = htons(_port);      // 這里有個細節(jié),我們會發(fā)現(xiàn)當我們接受數(shù)據(jù)的時候是不需要主機轉(zhuǎn)網(wǎng)路序列的,因為關(guān)于IO類的接口,內(nèi)部都幫我們實現(xiàn)了這一功能,這里不幫我們做是因為我們傳入的是一個結(jié)構(gòu)體,系統(tǒng)做不到
            local.sin_addr.s_addr = INADDR_ANY; // 接受任意ip地址
            if (bind(_listensock, (struct sockaddr *)&local, sizeof(local)) < 0)
            {
                logMessage(FATAL, "bind socket error");
                exit(BIND_ERR);
            }
            logMessage(NORMAL, "bind socket success");

            // 3. 設(shè)置socket 為監(jiān)聽狀態(tài) -- TCP與UDP不同,它先要建立鏈接之后,TCP是面向鏈接的,后面還會有“握手”過程
            if (listen(_listensock, gbacklog) < 0) // 第二個參數(shù)backlog后面再填這個坑
            {
                logMessage(FATAL, "listen socket error");
                exit(LISTEN_ERR);
            }
            logMessage(NORMAL, "listen socket success");
        }

        void start()
        {
            for (;;) // 一個死循環(huán)
            {
                // 4. server 獲取新鏈接
                // sock 和client 進行通信的fd
                struct sockaddr_in peer;
                socklen_t len = sizeof(peer);
                int sock = accept(_listensock, (struct sockaddr *)&peer, &len);
                if (sock < 0)
                {
                    logMessage(ERROR, "accept error, next"); // 這個不影響服務器的運行,用ERROR,就像張三不會因為沒有把人招呼進來就不干了
                    continue;
                }
                logMessage(NORMAL, "accept a new link success");
                std::cout << "sock: " << sock << std::endl;

                // 5. 這里就是一個sock, 未來通信我們就用這個sock, 面向字節(jié)流的,后續(xù)全部都是文件操作!
                // 我們就可以直接使用read之類的面向字節(jié)流的操作都行
                // version 1
                serviceIO(sock);
                close(sock); // 走到這里就說明客戶端已經(jīng)關(guān)閉
                             // 對一個已經(jīng)使用完畢的sock,我們要關(guān)閉這個sock,要不然會導致,文件描述符會越來越少,因為文件描述符本質(zhì)就是一個數(shù)組下標
                             // 只要是數(shù)組下標就會有盡頭,提供服務的上限 就等于文件描述符的上限
                             // 對一個已經(jīng)使用完畢的sock,我們要關(guān)閉這個sock,要不然會導致,文件描述符泄漏
            }
        }

        void serviceIO(int sock)
        {
            // 先用最簡單的,讀取再寫回去
            char buffer[1024];
            while (true)
            {
                ssize_t n = read(sock, buffer, sizeof(buffer) - 1);
                if (n > 0)
                {
                    // 截至目前,我們把讀到的數(shù)據(jù)當作字符串
                    buffer[n] = 0;
                    std::cout << "recv message: " << buffer << std::endl;

                    std::string outbuffer = buffer;
                    outbuffer += "server[echo]";

                    write(sock, outbuffer.c_str(), outbuffer.size()); // 在多路轉(zhuǎn)接的時候再詳談write的返回值
                }
                else if (n == 0)
                {
                    // 代表client退出 -- 把它想象成一個建立好的管道,客戶端不寫了,并且把它的文件描述符關(guān)了,讀端就會像管道一樣讀到 0 TCP同理
                    logMessage(NORMAL, "client quit, me too!");
                    break;
                }
            }
        }

        ~TcpServer() {}

    private:
        int _listensock; // 修改二:改為listensock 不是用來進行數(shù)據(jù)通信的,它是用來監(jiān)聽鏈接到來,獲取新鏈接的!
        uint16_t _port;
    };

} // namespace server

轉(zhuǎn)下文:簡單的TCP網(wǎng)絡程序·多進程、多線程(后端服務器)_文章來源地址http://www.zghlxwxcb.cn/news/detail-501312.html

到了這里,關(guān)于簡單的TCP網(wǎng)絡程序·單進程(后端服務器)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 簡單的UDP網(wǎng)絡程序·續(xù)寫(后端服務器)

    簡單的UDP網(wǎng)絡程序·續(xù)寫(后端服務器)

    該文承接文章?簡單的UDP網(wǎng)絡程序 對于客戶端和服務端的基本源碼參考上文,該文對服務器潤色一下,并且實現(xiàn)幾個基本的業(yè)務服務邏輯 目錄 demo1 第一個功能:字典翻譯 初始化字典 測試代碼:打印 字符串分割 客戶端修改 成品效果 字典熱加載 signal demo2 遠端命令行解析 p

    2024年02月09日
    瀏覽(22)
  • 網(wǎng)絡編程(一)TCP單進程服務器編程詳解

    想要學習socket網(wǎng)絡編程的讀者一定要首先學好計算機網(wǎng)絡的理論知識,包括 1)osi網(wǎng)絡七層模型與ip四層模型 2)套接字含義 3)局域網(wǎng)通信過程 4)廣域網(wǎng)通信過程 5)tcp,udp通信協(xié)議,在這兩個協(xié)議中的連接建立,數(shù)據(jù)封裝,傳輸過程,傳輸中可能遇到的問題的處理(差錯控

    2024年02月15日
    瀏覽(31)
  • 網(wǎng)絡字節(jié)序——TCP接口及其實現(xiàn)簡單TCP服務器

    網(wǎng)絡字節(jié)序——TCP接口及其實現(xiàn)簡單TCP服務器

    簡單TCP服務器的實現(xiàn) TCP區(qū)別于UDP在于要設(shè)置套接字為監(jiān)控狀態(tài),即TCP是面向鏈接,因此TCP套接字需要設(shè)置為監(jiān)聽狀態(tài) socket函數(shù)原型 domain 表示協(xié)議族,常用的有 AF_INET (IPv4)和 AF_INET6 (IPv6)。 type 表示Socket類型,常用的有 SOCK_STREAM (TCP)和 SOCK_DGRAM (UDP)。 protocol 通???/p>

    2024年02月10日
    瀏覽(27)
  • 多進程并發(fā)TCP服務器模型(含客戶端)(網(wǎng)絡編程 C語言實現(xiàn))

    摘要 :大家都知道不同pc間的通信需要用到套接字sockte來實現(xiàn),但是服務器一次只能收到一個客戶端發(fā)來的消息,所以為了能讓服務器可以接收多個客戶端的連接與消息的傳遞,我們就引入了多進程并發(fā)這樣一個概念。聽名字就可以知道--需要用到進程,當然也有多線程并發(fā)

    2024年02月17日
    瀏覽(105)
  • 網(wǎng)絡通信(13)-C#TCP服務器和客戶端同時在一個進程實現(xiàn)的實例

    網(wǎng)絡通信(13)-C#TCP服務器和客戶端同時在一個進程實現(xiàn)的實例

    有時項目需求中需要服務器和客戶端同時在一個進程實現(xiàn),一邊需要現(xiàn)場接收多個客戶端的數(shù)據(jù),一邊需要將數(shù)據(jù)匯總后發(fā)送給遠程服務器。下面通過實例演示此項需求。 C#TCP服務器和客戶端同時在一個進程實現(xiàn)的實例如下: 界面設(shè)計 UI文件代碼

    2024年01月22日
    瀏覽(34)
  • C#實現(xiàn)簡單TCP服務器和客戶端網(wǎng)絡編程

    C#實現(xiàn)簡單TCP服務器和客戶端網(wǎng)絡編程

    在C#中進行網(wǎng)絡編程涉及許多類和命名空間,用于創(chuàng)建和管理網(wǎng)絡連接、傳輸數(shù)據(jù)等。下面是一些主要涉及的類和命名空間: System.Net 命名空間: 這個命名空間提供了大部分網(wǎng)絡編程所需的類,包括: IPAddress :用于表示IP地址。 IPEndPoint :表示IP地址和端口號的組合。 Socke

    2024年02月11日
    瀏覽(37)
  • 【網(wǎng)絡編程】實現(xiàn)一個簡單多線程版本TCP服務器(附源碼)

    【網(wǎng)絡編程】實現(xiàn)一個簡單多線程版本TCP服務器(附源碼)

    accept 函數(shù)是在服務器端用于接受客戶端連接請求的函數(shù),它在監(jiān)聽套接字上等待客戶端的連接,并在有新的連接請求到來時創(chuàng)建一個新的套接字用于與該客戶端通信。 下面是 accept 函數(shù)的詳細介紹以及各個參數(shù)的意義: sockfd: 是服務器監(jiān)聽套接字的文件描述符,通常是使用

    2024年02月13日
    瀏覽(30)
  • Linux網(wǎng)絡編程二(TCP三次握手、四次揮手、TCP滑動窗口、MSS、TCP狀態(tài)轉(zhuǎn)換、多進程/多線程服務器實現(xiàn))

    Linux網(wǎng)絡編程二(TCP三次握手、四次揮手、TCP滑動窗口、MSS、TCP狀態(tài)轉(zhuǎn)換、多進程/多線程服務器實現(xiàn))

    TCP三次握手 TCP 三次握手 (TCP three-way handshake)是TCP協(xié)議建立可靠連接的過程,確保客戶端和服務器之間可以進行可靠的通信。下面是TCP三次握手的詳細過程: 假設(shè)客戶端為A,服務器為B 1 、第一次握手(SYN=1,seq=500) A向B發(fā)送一個帶有SYN標志位的數(shù)據(jù)包,表示A請求建立連接。

    2024年02月06日
    瀏覽(42)
  • 【網(wǎng)絡原理】使用Java基于TCP搭建簡單客戶端與服務器通信

    【網(wǎng)絡原理】使用Java基于TCP搭建簡單客戶端與服務器通信

    TCP服務器與客戶端的搭建需要借助以下API ServerSocket 是創(chuàng)建TCP服務端Socket的API。 ServerSocket 構(gòu)造方法 : 方法簽名 方法說明 ServerSocket(int port) 創(chuàng)建一個服務端流套接字Socket,并綁定到指定端口 ServerSocket 方法: 方法簽名 方法說明 Socket accept() 開始監(jiān)聽指定端口(創(chuàng)建時綁定的端

    2024年03月12日
    瀏覽(34)
  • Linux網(wǎng)絡編程二(TCP圖解三次握手及四次揮手、TCP滑動窗口、MSS、TCP狀態(tài)轉(zhuǎn)換、多進程/多線程服務器實現(xiàn))

    Linux網(wǎng)絡編程二(TCP圖解三次握手及四次揮手、TCP滑動窗口、MSS、TCP狀態(tài)轉(zhuǎn)換、多進程/多線程服務器實現(xiàn))

    1、TCP三次握手 TCP 三次握手 (TCP three-way handshake)是 TCP協(xié)議建立可靠連接 的過程,確??蛻舳撕头掌髦g可以進行可靠的通信。下面是TCP三次握手的 詳細過程 : 假設(shè)客戶端為A,服務器為B。 (1) 第一次握手 第一次握手(SYN=1,seq=500) A向B發(fā)送一個帶有 SYN 標志位的數(shù)據(jù)包,

    2024年04月22日
    瀏覽(37)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包