0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux下TCP網(wǎng)絡(luò)編程-創(chuàng)建服務(wù)器與客戶端

DS小龍哥-嵌入式技術(shù) ? 來(lái)源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-08-14 09:26 ? 次閱讀

一、前言

互聯(lián)網(wǎng)概念誕生于20世紀(jì)60年代末,從9幾年中國(guó)接入互聯(lián)網(wǎng)開(kāi)始到現(xiàn)在,生活的每個(gè)角落都能看到網(wǎng)絡(luò)的使用?,F(xiàn)在物聯(lián)網(wǎng)時(shí)代、共享經(jīng)濟(jì)的到來(lái),生活中不僅僅電腦、手機(jī)可以接入網(wǎng)絡(luò),身邊的各個(gè)設(shè)備也能接入互聯(lián)網(wǎng)了。 比如:市政路燈、污水井蓋、家用電器,汽車等等。

這篇文章介紹在Linux下的socket編程,完成TCP服務(wù)器、客戶端的創(chuàng)建,實(shí)現(xiàn)數(shù)據(jù)通信

二、TCP協(xié)議介紹

在Linux應(yīng)用層做編程,接觸到是傳輸層協(xié)議,TCP/UDP,如果搞Linux網(wǎng)絡(luò)驅(qū)動(dòng)開(kāi)發(fā)(網(wǎng)卡驅(qū)動(dòng)),那么底層的網(wǎng)絡(luò)協(xié)議就會(huì)接觸的更多,協(xié)議只是一個(gè)數(shù)據(jù)格式的約定而已,自己也可以設(shè)計(jì)自己的協(xié)議。

下面這張圖介紹兩個(gè)設(shè)備通過(guò)網(wǎng)絡(luò)通信的一個(gè)大致流程:

image-20211202132822244

TCP協(xié)議是點(diǎn)對(duì)點(diǎn)傳輸協(xié)議。TCP協(xié)議屬于C/S模型。
TCP協(xié)議里包含服務(wù)器和客戶端。
服務(wù)器必須要比客戶端先存在,客戶端必須連接服務(wù)器,服務(wù)器必須被客戶端連接。
接下來(lái)學(xué)習(xí)主要學(xué)習(xí)TCP服務(wù)器創(chuàng)建和TCP客戶端創(chuàng)建,完成客戶端與服務(wù)器之間的通信。
TCP服務(wù)器可以被多個(gè)客戶端連接。

image-20211202132933733

Linux下socket編程需要用到的相關(guān)函數(shù):

#include           /* See NOTES */
#include 

int socket(int domain, int type, int protocol);
AF_UNIX, AF_LOCAL   Local communication              unix(7)
AF_INET             IPv4 Internet protocols          ip(7)
AF_INET6            IPv6 Internet protocols          ipv6(7)
AF_IPX              IPX - Novell protocols
AF_NETLINK          Kernel user interface device     netlink(7)
AF_X25              ITU-T X.25 / ISO-8208 protocol   x25(7)
AF_AX25             Amateur radio AX.25 protocol
AF_ATMPVC           Access to raw ATM PVCs
AF_APPLETALK        AppleTalk                        ddp(7)
AF_PACKET           Low level packet interface       packet(7)
AF_ALG              Interface to kernel crypto API

#include           /* See NOTES */
#include 
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
struct sockaddr {
   sa_family_t sa_family;
   char        sa_data[14];
}

#include           /* See NOTES */
#include 

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

#define _GNU_SOURCE             /* See feature_test_macros(7) */
#include 
int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);

#include           /* See NOTES */
#include 
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

三、案例代碼

3.1 創(chuàng)建TCP服務(wù)器

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

/*
TCP服務(wù)器創(chuàng)建步驟:
1. 創(chuàng)建socket套接字(類似于open打開(kāi)文件一樣)
2. 綁定端口號(hào)和IP地址
3. 設(shè)置監(jiān)聽(tīng)等待隊(duì)列的數(shù)量
4. 等待客戶端連接
5. 完成正常數(shù)據(jù)收發(fā)

0x1234
192.168.1.123
255.255.255.255
*/
int main(int argc,char **argv)
{   
    if(argc!=2)
    {
        printf("./app <端口號(hào)>\n");
        return 0;
    }
    int sockfd;
    /*1. 創(chuàng)建socket套接字*/
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    /*2. 綁定端口號(hào)與IP地址*/
    struct sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port=htons(atoi(argv[1])); // 端口號(hào)0~65535
    addr.sin_addr.s_addr=INADDR_ANY;    //inet_addr("0.0.0.0"); //IP地址
    if(bind(sockfd,(const struct sockaddr *)&addr,sizeof(struct sockaddr))!=0)
    {
        printf("服務(wù)器:端口號(hào)綁定失敗.\n");
    }
    /*3. 設(shè)置監(jiān)聽(tīng)的數(shù)量*/
    listen(sockfd,20);
    /*4. 等待客戶端連接*/
    int client_fd;
    struct sockaddr_in client_addr;
    socklen_t addrlen=sizeof(struct sockaddr_in);
    client_fd=accept(sockfd, (struct sockaddr *)&client_addr,&addrlen);
    if(client_fd<0)
    {
        printf("客戶端連接失敗.\n");
        return 0;
    }
    printf("連接的客戶端IP地址:%s\n",inet_ntoa(client_addr.sin_addr));
    printf("連接的客戶端端口號(hào):%d\n",ntohs(client_addr.sin_port));
    /*5. 完成通信*/
    write(client_fd,"1234567890",10);
    /*6. 關(guān)閉連接*/
    close(client_fd);
    close(sockfd);
    return 0;
}

3.2 創(chuàng)建TCP客戶端

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

/*
TCP客戶端創(chuàng)建步驟:
1. 創(chuàng)建socket套接字(類似于open打開(kāi)文件一樣)
2. 連接服務(wù)器 
3. 完成正常數(shù)據(jù)收發(fā)

*/
int main(int argc,char **argv)
{   
    if(argc!=3)
    {
        printf("./app   <端口號(hào)>\n");
        return 0;
    }
    int sockfd;
    /*1. 創(chuàng)建socket套接字*/
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    /*2. 連接服務(wù)器*/
    struct sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port=htons(atoi(argv[2])); // 端口號(hào)0~65535
    addr.sin_addr.s_addr=inet_addr(argv[1]); //IP地址
    if(connect(sockfd,(const struct sockaddr *)&addr,sizeof(struct sockaddr_in))!=0)
    {
        printf("客戶端:服務(wù)器連接失敗.\n");
        return 0;
    }
    /*3. 完成數(shù)據(jù)通信*/
    char buff[1024];
    int cnt;
    cnt=read(sockfd,buff,1024);
    buff[cnt]='\0';
    printf("客戶端收到的數(shù)據(jù):%s,%d\n",buff,cnt);
    
    close(sockfd);
    return 0;
}

審核編輯:湯梓紅地址>
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207898
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8700

    瀏覽量

    84537
  • 網(wǎng)絡(luò)編程
    +關(guān)注

    關(guān)注

    0

    文章

    66

    瀏覽量

    10012
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux網(wǎng)絡(luò)編程-TCP客戶端如何獲取要連接的服務(wù)端IP?

    本篇介紹了在TCP通信中,客戶端通過(guò)UDP廣播,實(shí)現(xiàn)自動(dòng)獲取服務(wù)端的IP地址,并進(jìn)行TCP連接的具體方法,并通過(guò)代碼實(shí)現(xiàn),來(lái)測(cè)試此方案是實(shí)際效果,為了使
    的頭像 發(fā)表于 09-27 08:56 ?3411次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>編程</b>-<b class='flag-5'>TCP</b><b class='flag-5'>客戶端</b>如何獲取要連接的<b class='flag-5'>服務(wù)端</b>IP?

    如果ESP上的TCP客戶端服務(wù)器斷開(kāi)連接,如何啟用自動(dòng)重連?

    ESP - TCP 客戶端 嵌入式 Linux 服務(wù)器 - TCP 服務(wù)器 如果ESP上的
    發(fā)表于 07-17 06:25

    labview TCP客戶端

    最近在做一個(gè)labview 客戶端測(cè)試小程序,服務(wù)器采用MFC編寫(xiě),客戶端采用TCP偵聽(tīng)函數(shù),通信可以連接,數(shù)據(jù)也正確,但是服務(wù)器端檢測(cè)發(fā)送
    發(fā)表于 06-30 23:15

    uip協(xié)議網(wǎng)絡(luò)客戶端設(shè)備與linux網(wǎng)絡(luò)服務(wù)器設(shè)備直連tcp無(wú)法連接

    uip協(xié)議網(wǎng)絡(luò)客戶端設(shè)備與linux網(wǎng)絡(luò)服務(wù)器設(shè)備直連tcp無(wú)法連接,通過(guò)HUB就可以正常連接,uip設(shè)備與PC直連也能正常連接,找不到問(wèn)題
    發(fā)表于 12-04 08:55

    labview-TCP客戶端服務(wù)器

    labview-TCP客戶端服務(wù)器一個(gè)服務(wù)器上位機(jī),多個(gè)下位機(jī)客戶端
    發(fā)表于 03-26 16:58

    不能打開(kāi)TCP客戶端服務(wù)器

    您好,我使用PrimeV2.0和MPLAB V3.5與PIC32 MX795F512,我不能打開(kāi)TCP客戶端服務(wù)器。我使用的是協(xié)調(diào)函數(shù)TCPIPpTCPPclitOnTune
    發(fā)表于 04-30 13:24

    如何協(xié)調(diào)TCP/IP服務(wù)器以訪問(wèn)多個(gè)客戶端

    服務(wù)器。我的代碼是附加的。我的代碼打開(kāi)允許3個(gè)TCP連接,但打印您好!在關(guān)閉連接之前每次連接兩次。我相信有更好的方法來(lái)建立數(shù)據(jù)結(jié)構(gòu)來(lái)接受多個(gè)客戶端連接,但我不知所措。任何方向或幫助將不勝感激。
    發(fā)表于 04-27 07:34

    4412開(kāi)發(fā)板Qt網(wǎng)絡(luò)編程-TCP實(shí)現(xiàn)服務(wù)器客戶端

    網(wǎng)絡(luò)編程TCP 和 UDP,TCP 編程需要用到倆個(gè)類:QTcpServer 和 QTcpSocket。1
    發(fā)表于 04-28 15:33

    TCP服務(wù)器創(chuàng)建過(guò)程

    用過(guò)正點(diǎn)原子LWIP服務(wù)器例程開(kāi)發(fā)的朋友可能知道,例程的設(shè)計(jì)是只支持一個(gè)客戶端連接的,但實(shí)際應(yīng)用中往往需要用到多客戶端連接。下面是在正點(diǎn)原子擴(kuò)展例程網(wǎng)絡(luò)實(shí)驗(yàn)14 NETCONN_
    發(fā)表于 08-24 08:03

    Labview TCP服務(wù)器和多個(gè)客戶端問(wèn)題

    我開(kāi)啟一個(gè)Labview TCP服務(wù)器,與外部?jī)蓚€(gè)TCP客戶端連接,兩個(gè)客戶端會(huì)定時(shí)給服務(wù)端發(fā)送
    發(fā)表于 04-13 18:43

    如何創(chuàng)建客戶端將連接到服務(wù)器的網(wǎng)狀網(wǎng)絡(luò)?

    的問(wèn)題是:如何創(chuàng)建客戶端將連接到服務(wù)器的網(wǎng)狀網(wǎng)絡(luò)(或者服務(wù)器將多次提供與網(wǎng)狀的連接)有任何想法嗎?我錯(cuò)過(guò)了什么?是否有應(yīng)該唯一的
    發(fā)表于 03-02 07:54

    網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP TCP客戶端TCP服務(wù)器端應(yīng)用程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP TCP客戶端TCP服務(wù)器端應(yīng)用程序免費(fèi)下載。
    發(fā)表于 08-30 08:00 ?16次下載
    <b class='flag-5'>網(wǎng)絡(luò)</b>調(diào)試和串口調(diào)試集合UDP <b class='flag-5'>TCP</b><b class='flag-5'>客戶端</b>和<b class='flag-5'>TCP</b><b class='flag-5'>服務(wù)器端</b>應(yīng)用程序免費(fèi)下載

    Linux網(wǎng)絡(luò)編程TCP并發(fā)服務(wù)器TCP客戶端程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是Linux網(wǎng)絡(luò)編程TCP并發(fā)服務(wù)器TCP
    發(fā)表于 01-08 15:12 ?9次下載
    <b class='flag-5'>Linux</b>下<b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>編程</b><b class='flag-5'>TCP</b>并發(fā)<b class='flag-5'>服務(wù)器</b>和<b class='flag-5'>TCP</b><b class='flag-5'>客戶端</b>程序免費(fèi)下載

    STM32+LWIP服務(wù)器實(shí)現(xiàn)多客戶端連接

    用過(guò)正點(diǎn)原子LWIP服務(wù)器例程開(kāi)發(fā)的朋友可能知道,例程的設(shè)計(jì)是只支持一個(gè)客戶端連接的,但實(shí)際應(yīng)用中往往需要用到多客戶端連接。下面是在正點(diǎn)原子擴(kuò)展例程 網(wǎng)絡(luò)實(shí)驗(yàn)14 NETCONN_
    發(fā)表于 12-23 19:59 ?59次下載
    STM32+LWIP<b class='flag-5'>服務(wù)器</b>實(shí)現(xiàn)多<b class='flag-5'>客戶端</b>連接

    服務(wù)器Server和客戶端Client的區(qū)別

    例如在使用TCP通訊建立連接時(shí)采用客戶端服務(wù)器模式,這種模式又常常被稱為主從式架構(gòu),簡(jiǎn)稱為C/S結(jié)構(gòu),屬于一種網(wǎng)絡(luò)通訊架構(gòu),將通訊的雙方以客戶端
    的頭像 發(fā)表于 09-06 16:13 ?1176次閱讀
    <b class='flag-5'>服務(wù)器</b>Server和<b class='flag-5'>客戶端</b>Client的區(qū)別