那曲檬骨新材料有限公司

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2022-08-14 09:26 ? 次閱讀

一、前言

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

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

二、TCP協(xié)議介紹

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

下面這張圖介紹兩個設備通過網絡通信的一個大致流程:

image-20211202132822244

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

image-20211202132933733

Linux下socket編程需要用到的相關函數(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服務器

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

/*
TCP服務器創(chuàng)建步驟:
1. 創(chuàng)建socket套接字(類似于open打開文件一樣)
2. 綁定端口號和IP地址
3. 設置監(jiān)聽等待隊列的數(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 <端口號>\n");
        return 0;
    }
    int sockfd;
    /*1. 創(chuàng)建socket套接字*/
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    /*2. 綁定端口號與IP地址*/
    struct sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port=htons(atoi(argv[1])); // 端口號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("服務器:端口號綁定失敗.\n");
    }
    /*3. 設置監(jiān)聽的數(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("連接的客戶端端口號:%d\n",ntohs(client_addr.sin_port));
    /*5. 完成通信*/
    write(client_fd,"1234567890",10);
    /*6. 關閉連接*/
    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打開文件一樣)
2. 連接服務器 
3. 完成正常數(shù)據(jù)收發(fā)

*/
int main(int argc,char **argv)
{   
    if(argc!=3)
    {
        printf("./app   <端口號>\n");
        return 0;
    }
    int sockfd;
    /*1. 創(chuàng)建socket套接字*/
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    /*2. 連接服務器*/
    struct sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port=htons(atoi(argv[2])); // 端口號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("客戶端:服務器連接失敗.\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;
}

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

    關注

    87

    文章

    11345

    瀏覽量

    210378
  • 服務器
    +關注

    關注

    12

    文章

    9303

    瀏覽量

    86059
  • 網絡編程
    +關注

    關注

    0

    文章

    72

    瀏覽量

    10101
收藏 人收藏

    評論

    相關推薦

    Linux網絡編程-TCP客戶端如何獲取要連接的服務端IP?

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

    如果ESP上的TCP客戶端服務器斷開連接,如何啟用自動重連?

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

    labview TCP客戶端

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

    uip協(xié)議網絡客戶端設備與linux網絡服務器設備直連tcp無法連接

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

    labview-TCP客戶端服務器

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

    不能打開TCP客戶端服務器

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

    如何協(xié)調TCP/IP服務器以訪問多個客戶端

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

    4412開發(fā)板Qt網絡編程-TCP實現(xiàn)服務器客戶端

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

    TCP服務器創(chuàng)建過程

    用過正點原子LWIP服務器例程開發(fā)的朋友可能知道,例程的設計是只支持一個客戶端連接的,但實際應用中往往需要用到多客戶端連接。下面是在正點原子擴展例程網絡實驗14 NETCONN_
    發(fā)表于 08-24 08:03

    Labview TCP服務器和多個客戶端問題

    我開啟一個Labview TCP服務器,與外部兩個TCP客戶端連接,兩個客戶端會定時給服務端發(fā)送
    發(fā)表于 04-13 18:43

    如何創(chuàng)建客戶端將連接到服務器的網狀網絡

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

    網絡調試和串口調試集合UDP TCP客戶端TCP服務器端應用程序免費下載

    本文檔的主要內容詳細介紹的是網絡調試和串口調試集合UDP TCP客戶端TCP服務器端應用程序免費下載。
    發(fā)表于 08-30 08:00 ?16次下載
    <b class='flag-5'>網絡</b>調試和串口調試集合UDP <b class='flag-5'>TCP</b><b class='flag-5'>客戶端</b>和<b class='flag-5'>TCP</b><b class='flag-5'>服務器端</b>應用程序免費下載

    Linux網絡編程TCP并發(fā)服務器TCP客戶端程序免費下載

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

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

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

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

    例如在使用TCP通訊建立連接時采用客戶端服務器模式,這種模式又常常被稱為主從式架構,簡稱為C/S結構,屬于一種網絡通訊架構,將通訊的雙方以客戶端
    的頭像 發(fā)表于 09-06 16:13 ?1457次閱讀
    <b class='flag-5'>服務器</b>Server和<b class='flag-5'>客戶端</b>Client的區(qū)別
    百家乐庄河闲的赌法| 圣淘沙百家乐官网娱乐城| 申城棋牌官网| 大发888官方 46| 大发888游戏充值| 亚洲顶级赌场 网投领导者| 大发888网址官方| 尊龙国际娱乐| 2013现金棋牌游戏| 云鼎百家乐代理| 太阳城绿萱园| 大发888在线官方| 和记国际娱乐| 大发888真人娱乐场网址官网| 水果机8键遥控器| 皇冠现金网址| 镇安县| 百家乐官网龙虎的投注法| 闲和庄百家乐官网娱乐场| 百家乐官网网上娱乐场开户注册| 做生意房门挂啥招财| 任我赢百家乐自动投注分析系统| 一筒百家乐的玩法技巧和规则| 大发888真钱娱乐场下载| 24山阴宅评凶吉| 真人百家乐赌法| 赌场百家乐破解| 威尼斯人娱乐城位置| 丽都棋牌下载| 百家乐官网视频游戏客服| 百家乐官网包赢| 博彩网百家乐官网全讯网| 百家乐赢钱公式冯耕| 威尼斯人娱乐城官网lm0| 皇冠网游戏小说| 百家乐官网佛泰阁| 六合彩票| 百家乐官网偷码| 百家乐闲单开多少| 大发888娱乐城注册lm0| 山东|