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

Linux下網(wǎng)絡編程(3)——socket編程實戰(zhàn),如何構(gòu)建一個服務器和客戶端連接

這篇具有很好參考價值的文章主要介紹了Linux下網(wǎng)絡編程(3)——socket編程實戰(zhàn),如何構(gòu)建一個服務器和客戶端連接。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

????????經(jīng)過前幾篇的介紹,本文我們將進行編程實戰(zhàn),實現(xiàn)一個簡單地服務器和客戶端應用程序。

編寫服務器程序

????????編寫服務器應用程序的流程如下:

????????①、調(diào)用 socket()函數(shù)打開套接字,得到套接字描述符;

????????②、調(diào)用 bind()函數(shù)將套接字與 IP 地址、端口號進行綁定;

????????③、調(diào)用 listen()函數(shù)讓服務器進程進入監(jiān)聽狀態(tài);

????????④、調(diào)用 accept()函數(shù)獲取客戶端的連接請求并建立連接;

????????⑤、調(diào)用 read()/recv()、write()/send() 與客戶端進行通信;

????????⑥、調(diào)用 close()關(guān)閉套接字。

????????下面,我們就根據(jù)上面列舉的步驟來編寫一個簡單的服務器應用程序,代碼如下所示:

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

#define SERVER_PORT     8888    //端口號不能發(fā)生沖突,不常用的端口號通常大于5000

int main(void){
    struct sockaddr_in server_addr = {0};
    struct sockaddr_in client_addr = {0};
    char ip_str[20] = {0};
    int sockfd, connfd;
    int addrlen = sizeof(client_addr);
    char recvbuf[512];
    int ret;

    /* 打開套接字,得到套接字描述符 */
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (0 > sockfd) {
        perror("socket error");
        exit(EXIT_FAILURE);
    }

    /* 將套接字與指定端口號進行綁定 */
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(SERVER_PORT);

    ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
    if (0 > ret) {
        perror("bind error");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    /* 使服務器進入監(jiān)聽狀態(tài) */
    ret = listen(sockfd, 50);
    if (0 > ret) {
        perror("listen error");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    /* 阻塞等待客戶端連接 */
    connfd = accept(sockfd, (struct sockaddr *)&client_addr, &addrlen);
    if (0 > connfd) {
        perror("accept error");
        close(sockfd);
        exit(EXIT_FAILURE);
    }
    printf("有客戶端接入...\n");
    inet_ntop(AF_INET, &client_addr.sin_addr.s_addr, ip_str, sizeof(ip_str));
    printf("客戶端主機的IP地址: %s\n", ip_str);
    printf("客戶端進程的端口號: %d\n", client_addr.sin_port);

    /* 接收客戶端發(fā)送過來的數(shù)據(jù) */
    for ( ; ; ) {
        // 接收緩沖區(qū)清零
        memset(recvbuf, 0x0, sizeof(recvbuf));

        // 讀數(shù)據(jù)
        ret = recv(connfd, recvbuf, sizeof(recvbuf), 0);
        if(0 >= ret) {
            perror("recv error");
            close(connfd);
            break;
        }
        // 將讀取到的數(shù)據(jù)以字符串形式打印出來
        printf("from client: %s\n", recvbuf);

        // 如果讀取到"exit"則關(guān)閉套接字退出程序
        if (0 == strncmp("exit", recvbuf, 4)) {
            printf("server exit...\n");
            close(connfd);
            break;
        }
    }
    /* 關(guān)閉套接字 */
    close(sockfd);
    exit(EXIT_SUCCESS);
}

????????以上我們實現(xiàn)了一個非常簡單地服務器應用程序,根據(jù)上面列舉的步驟完成了這個示例代碼,最終的功能是,當客戶端連接到服務器之后,客戶端會向服務器(也就是本程序)發(fā)送數(shù)據(jù),在我們服務器應用程序中會讀取客戶端發(fā)送的數(shù)據(jù)并將其打印出來,就是這么簡單的一個功能。

????????SERVER_PORT 宏指定了本服務器綁定的端口號,這里我們將端口號設(shè)置為 8888,端口不能與其它服務器的端口號發(fā)生沖突,不常用的端口號通常大于 5000。

????????另外,bind綁定的IP地址是 INADDR_ANY,即表示所有發(fā)送到服務器的這個端口,不管是哪個網(wǎng)卡/哪個IP地址接收到的數(shù)據(jù),都由這個服務端進程進行處理。

編寫客戶端程序

????????接下來我們再編寫一個簡單地客戶端應用程序,客戶端的功能是連接上小節(jié)所實現(xiàn)的服務器,連接成功之后向服務器發(fā)送數(shù)據(jù),發(fā)送的數(shù)據(jù)由用戶輸入。示例代碼如下所示:

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

#define SERVER_PORT		8888          	//服務器的端口號
#define SERVER_IP   	"192.168.1.150"	//服務器的IP地址

int main(void){
    struct sockaddr_in server_addr = {0};
    char buf[512];
    int sockfd;
    int ret;

    /* 打開套接字,得到套接字描述符 */
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (0 > sockfd) {
        perror("socket error");
        exit(EXIT_FAILURE);
    }

    /* 調(diào)用connect連接遠端服務器 */
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SERVER_PORT);  //端口號
    inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);//IP地址
    ret = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
    if (0 > ret) {
        perror("connect error");
        close(sockfd);
        exit(EXIT_FAILURE);
    }
    printf("服務器連接成功...\n\n");

    /* 向服務器發(fā)送數(shù)據(jù) */
    for ( ; ; ) {
        // 清理緩沖區(qū)
        memset(buf, 0x0, sizeof(buf));

        // 接收用戶輸入的字符串數(shù)據(jù)
        printf("Please enter a string: ");
        fgets(buf, sizeof(buf), stdin);

        // 將用戶輸入的數(shù)據(jù)發(fā)送給服務器
        ret = send(sockfd, buf, strlen(buf), 0);
        if(0 > ret){
            perror("send error");
            break;
        }

        //輸入了"exit",退出循環(huán)
        if(0 == strncmp(buf, "exit", 4))
            break;
    }
    close(sockfd);
    exit(EXIT_SUCCESS);
}

????????代碼不再說明!需要注意的是 SERVER_IP 和 SERVER_PORT 指的是服務器的 IP 地址和端口號,服務器的 IP 地址根據(jù)實際情況進行設(shè)置,服務器應用程序服務器端代碼中我們綁定的端口號為 8888,所以在客戶端應用程序中我們也需要指定 SERVER_PORT 為 8888。

編譯測試

????????這里筆者將服務器程序運行在開發(fā)板上,而將客戶端應用程序運行在 Ubuntu 系統(tǒng),當然你也可以將客戶端和服務器程序都運行在開發(fā)板或 Ubuntu 系統(tǒng),這都是沒問題的。

????????首先編譯服務器應用程序和客戶端應用程序:

寫出實驗中l(wèi)inux socket通信實驗的代碼所在目錄。 在虛擬機linux中編譯并執(zhí)行此代,Linux,網(wǎng)絡,linux,網(wǎng)絡,服務器

?????????編譯得到 client 和 server 可執(zhí)行文件,server 可執(zhí)行文件在開發(fā)板上運行,client 可執(zhí)行文件在 PC 端 Ubuntu 系統(tǒng)下運行。將 server 可執(zhí)行文件拷貝到開發(fā)板目錄下,如下所示:

寫出實驗中l(wèi)inux socket通信實驗的代碼所在目錄。 在虛擬機linux中編譯并執(zhí)行此代,Linux,網(wǎng)絡,linux,網(wǎng)絡,服務器

?????????在開發(fā)板執(zhí)行 server:

寫出實驗中l(wèi)inux socket通信實驗的代碼所在目錄。 在虛擬機linux中編譯并執(zhí)行此代,Linux,網(wǎng)絡,linux,網(wǎng)絡,服務器

????????接著在 Ubuntu 系統(tǒng)執(zhí)行客戶端程序:

寫出實驗中l(wèi)inux socket通信實驗的代碼所在目錄。 在虛擬機linux中編譯并執(zhí)行此代,Linux,網(wǎng)絡,linux,網(wǎng)絡,服務器

?????????客戶端運行之后將會去連接遠端服務器,連接成功便會打印出信息“服務器連接成功...”,此時服務器也會監(jiān)測到客戶端連接,會打印相應的信息,如下所示:

寫出實驗中l(wèi)inux socket通信實驗的代碼所在目錄。 在虛擬機linux中編譯并執(zhí)行此代,Linux,網(wǎng)絡,linux,網(wǎng)絡,服務器

????????接下來我們便可以在客戶端處輸入字符串,客戶端程序會將我們輸入的字符串信息發(fā)送給服務器,服務器接收到之后將其打印出來,如下所示:

寫出實驗中l(wèi)inux socket通信實驗的代碼所在目錄。 在虛擬機linux中編譯并執(zhí)行此代,Linux,網(wǎng)絡,linux,網(wǎng)絡,服務器

Tips : 如果連接出現(xiàn)問題如“connect error: No route to host”,可以參考這篇問題記錄開發(fā)板和虛擬機socket報錯“connect error: No route to host”。

寫出實驗中l(wèi)inux socket通信實驗的代碼所在目錄。 在虛擬機linux中編譯并執(zhí)行此代,Linux,網(wǎng)絡,linux,網(wǎng)絡,服務器

?總結(jié)

????????到此,socket編程的內(nèi)容就告一段落,內(nèi)容講得非常淺,目的其實并不是讓大家學會網(wǎng)絡編程,旨在以引導大家入門為主,讓大家對 socket 網(wǎng)絡編程有一個基本的了解和認識。望諸君常學常新、學思踐悟。?文章來源地址http://www.zghlxwxcb.cn/news/detail-772169.html

到了這里,關(guān)于Linux下網(wǎng)絡編程(3)——socket編程實戰(zhàn),如何構(gòu)建一個服務器和客戶端連接的文章就介紹完了。如果您還想了解更多內(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)文章

  • Linux網(wǎng)絡編程- 原始套接字(Raw Socket)

    原始套接字(Raw Socket)提供了一種機制,允許應用程序直接訪問底層傳輸協(xié)議,繞過操作系統(tǒng)提供的傳輸層接口。這種套接字通常用于實現(xiàn)新的協(xié)議或?qū)ΜF(xiàn)有協(xié)議進行低級別的操作。 以下是對原始套接字的詳細介紹: 定義與用途 : 原始套接字是直接基于網(wǎng)絡層(如IP)的。

    2024年02月07日
    瀏覽(97)
  • Linux網(wǎng)絡編程:socket實現(xiàn)client/server通信

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

    閱讀 UNIX網(wǎng)絡編程 卷1:套接字聯(lián)網(wǎng)API 第3版 的前4個章節(jié),覺得有必要對書籍上的源碼案例進行復現(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 運行測試: ?? server.c僅僅實現(xiàn)對單個客戶

    2024年02月03日
    瀏覽(20)
  • 【Linux網(wǎng)絡】網(wǎng)絡編程套接字 -- 基于socket實現(xiàn)一個簡單UDP網(wǎng)絡程序

    【Linux網(wǎng)絡】網(wǎng)絡編程套接字 -- 基于socket實現(xiàn)一個簡單UDP網(wǎng)絡程序

    我們把數(shù)據(jù)從A主機發(fā)送到B主機,是目的嗎?不是,真正通信的不是這兩個機器!其實是這兩臺機器上面的軟件(人) 數(shù)據(jù)有 IP(公網(wǎng)) 標識一臺唯一的主機 ,用誰來標識各自主機上客戶或者服務進程的唯一性呢? 為了更好的表示一臺主機上服務進程的唯一性,我們采用 端口號

    2024年02月12日
    瀏覽(848)
  • Linux網(wǎng)絡編程:socket、客戶端服務器端使用socket通信(TCP)

    Linux網(wǎng)絡編程:socket、客戶端服務器端使用socket通信(TCP)

    socket(套接字),用于網(wǎng)絡中不同主機間進程的通信。 socket是一個偽文件,包含讀緩沖區(qū)、寫緩沖區(qū)。 socket必須成對出現(xiàn)。 socket可以建立主機進程間的通信,但需要協(xié)議(IPV4、IPV6等)、port端口、IP地址。 ??????? ?(1)創(chuàng)建流式socket套接字。 ? ? ? ? ? ? ? ? a)此s

    2024年02月11日
    瀏覽(34)
  • 【探索Linux】—— 強大的命令行工具 P.26(網(wǎng)絡編程套接字基本概念—— socket編程接口 | socket編程接口相關(guān)函數(shù)詳細介紹 )

    【探索Linux】—— 強大的命令行工具 P.26(網(wǎng)絡編程套接字基本概念—— socket編程接口 | socket編程接口相關(guān)函數(shù)詳細介紹 )

    本文將深入探討使用套接字進行網(wǎng)絡通信的基本步驟,包括創(chuàng)建套接字、綁定地址、監(jiān)聽連接(對于服務器端)、連接遠程主機(對于客戶端)、以及發(fā)送和接收數(shù)據(jù)等操作。套接字編程涉及一系列系統(tǒng)調(diào)用和函數(shù),如 socket() 、 bind() 、 listen() 、 connect() 、 send() 、 recv() 等。

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

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

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

    2024年02月05日
    瀏覽(21)
  • Linux網(wǎng)絡編程:Socket套接字編程(Server服務器 Client客戶端)

    Linux網(wǎng)絡編程:Socket套接字編程(Server服務器 Client客戶端)

    文章目錄: 一:定義和流程分析 1.定義 2.流程分析? 3.網(wǎng)絡字節(jié)序 二:相關(guān)函數(shù)? IP地址轉(zhuǎn)換函數(shù)inet_pton inet_ntop(本地字節(jié)序 網(wǎng)絡字節(jié)序) socket函數(shù)(創(chuàng)建一個套接字) bind函數(shù)(給socket綁定一個服務器地址結(jié)構(gòu)(IP+port)) listen函數(shù)(設(shè)置最大連接數(shù)或者說能同時進行三次握手的最

    2024年02月12日
    瀏覽(35)
  • C/C++ Linux Socket網(wǎng)絡編程 TCP 與 UDP

    C/C++ Linux Socket網(wǎng)絡編程 TCP 與 UDP

    之前已經(jīng)學習了QT的socket編程 和 C/C++在window環(huán)境的socket編程,現(xiàn)在再來學習一波C/C++在Linux環(huán)境下的socket編程,為以后學習C++ Linux 服務器開發(fā)做準備。 目錄 一、Socket簡介 二、Socket編程基礎(chǔ) 1. 網(wǎng)絡字節(jié)序 2. sockaddr數(shù)據(jù)結(jié)構(gòu) 3. IP地址轉(zhuǎn)換函數(shù) 三、TCP編程函數(shù) 1. socket函數(shù) 2.?bi

    2024年02月02日
    瀏覽(25)
  • Linux學習之網(wǎng)絡編程2(socket,簡單C/S模型)

    Linux學習之網(wǎng)絡編程2(socket,簡單C/S模型)

    Linux網(wǎng)絡編程我是看視頻學的,Linux網(wǎng)絡編程,看完這個視頻大概網(wǎng)絡編程的基礎(chǔ)差不多就掌握了。這個系列是我看這個Linux網(wǎng)絡編程視頻寫的筆記總結(jié)。 小端法:pc本地存儲,高位存高地址,低位存低地址。 大端法:網(wǎng)絡存儲,高位存低地址,低位存高地址。 由此我們看到

    2024年02月01日
    瀏覽(22)
  • Linux網(wǎng)絡編程:Socket服務器和客戶端實現(xiàn)雙方通信

    Linux網(wǎng)絡編程:Socket服務器和客戶端實現(xiàn)雙方通信

    目錄 一,什么是網(wǎng)絡編程 二,為什么使用端口號 三,TCP協(xié)議與UDP協(xié)議 ①TCP(傳輸控制協(xié)議) ②UDP(用戶數(shù)據(jù)報協(xié)議,User Data Protocol) ③總結(jié)歸納 四,Socket服務器和客戶端的開發(fā)流程 五,服務器和客戶端相關(guān)API說明 ①socket()函數(shù) ②bind()函數(shù) ③listen()函數(shù) ④accept()函數(shù) ⑤客戶端

    2024年02月11日
    瀏覽(34)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包