0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux下TCP网络编程-创建服务器与客户端

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-08-14 09:26 次阅读

一、前言

互联网概念诞生于20世纪60年代末,从9几年中国接入互联网开始到现在,生活的每个角落都能看到网络的使用。现在物联网时代、共享经济的到来,生活中不仅仅电脑手机可以接入网络,身边的各个设备也能接入互联网了。 比如:市政路灯、污水井盖、家用电器,汽车等等。

这篇文章介绍在Linux下的socket编程,完成TCP服务器、客户端的创建,实现数据通信

二、TCP协议介绍

在Linux应用层做编程,接触到是传输层协议,TCP/UDP,如果搞Linux网络驱动开发(网卡驱动),那么底层的网络协议就会接触的更多,协议只是一个数据格式的约定而已,自己也可以设计自己的协议。

下面这张图介绍两个设备通过网络通信的一个大致流程:

image-20211202132822244

TCP协议是点对点传输协议。TCP协议属于C/S模型。
TCP协议里包含服务器和客户端。
服务器必须要比客户端先存在,客户端必须连接服务器,服务器必须被客户端连接。
接下来学习主要学习TCP服务器创建和TCP客户端创建,完成客户端与服务器之间的通信。
TCP服务器可以被多个客户端连接。

image-20211202132933733

Linux下socket编程需要用到的相关函数:

#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 创建TCP服务器

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

/*
TCP服务器创建步骤:
1. 创建socket套接字(类似于open打开文件一样)
2. 绑定端口号和IP地址
3. 设置监听等待队列的数量
4. 等待客户端连接
5. 完成正常数据收发

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. 创建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. 设置监听的数量*/
    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 创建TCP客户端

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

/*
TCP客户端创建步骤:
1. 创建socket套接字(类似于open打开文件一样)
2. 连接服务器 
3. 完成正常数据收发

*/
int main(int argc,char **argv)
{   
    if(argc!=3)
    {
        printf("./app   <端口号>\n");
        return 0;
    }
    int sockfd;
    /*1. 创建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. 完成数据通信*/
    char buff[1024];
    int cnt;
    cnt=read(sockfd,buff,1024);
    buff[cnt]='\0';
    printf("客户端收到的数据:%s,%d\n",buff,cnt);
    
    close(sockfd);
    return 0;
}

审核编辑:汤梓红地址>
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11202

    浏览量

    208695
  • 服务器
    +关注

    关注

    12

    文章

    8953

    浏览量

    85066
  • 网络编程
    +关注

    关注

    0

    文章

    68

    浏览量

    10054
收藏 人收藏

    评论

    相关推荐

    Linux网络编程-TCP客户端如何获取要连接的服务端IP?

    本篇介绍了在TCP通信中,客户端通过UDP广播,实现自动获取服务端的IP地址,并进行TCP连接的具体方法,并通过代码实现,来测试此方案是实际效果,为了使
    的头像 发表于 09-27 08:56 3532次阅读
    <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上的
    发表于 07-17 06:25

    labview TCP客户端

    最近在做一个labview 客户端测试小程序,服务器采用MFC编写,客户端采用TCP侦听函数,通信可以连接,数据也正确,但是服务器端检测发送
    发表于 06-30 23:15

    uip协议网络客户端设备与linux网络服务器设备直连tcp无法连接

    uip协议网络客户端设备与linux网络服务器设备直连tcp无法连接,通过HUB就可以正常连接,uip设备与PC直连也能正常连接,找不到问题
    发表于 12-04 08:55

    labview-TCP客户端服务器

    labview-TCP客户端服务器一个服务器上位机,多个下位机客户端
    发表于 03-26 16:58

    不能打开TCP客户端服务器

    您好,我使用PrimeV2.0和MPLAB V3.5与PIC32 MX795F512,我不能打开TCP客户端服务器。我使用的是协调函数TCPIPpTCPPclitOnTune
    发表于 04-30 13:24

    如何协调TCP/IP服务器以访问多个客户端

    服务器。我的代码是附加的。我的代码打开允许3个TCP连接,但打印您好!在关闭连接之前每次连接两次。我相信有更好的方法来建立数据结构来接受多个客户端连接,但我不知所措。任何方向或帮助将不胜感激。
    发表于 04-27 07:34

    4412开发板Qt网络编程-TCP实现服务器客户端

    网络编程TCP 和 UDP,TCP 编程需要用到俩个类:QTcpServer 和 QTcpSocket。1
    发表于 04-28 15:33

    TCP服务器创建过程

    用过正点原子LWIP服务器例程开发的朋友可能知道,例程的设计是只支持一个客户端连接的,但实际应用中往往需要用到多客户端连接。下面是在正点原子扩展例程网络实验14 NETCONN_
    发表于 08-24 08:03

    Labview TCP服务器和多个客户端问题

    我开启一个Labview TCP服务器,与外部两个TCP客户端连接,两个客户端会定时给服务端发送
    发表于 04-13 18:43

    如何创建客户端将连接到服务器的网状网络

    的问题是:如何创建客户端将连接到服务器的网状网络(或者服务器将多次提供与网状的连接)有任何想法吗?我错过了什么?是否有应该唯一的
    发表于 03-02 07:54

    网络调试和串口调试集合UDP TCP客户端TCP服务器端应用程序免费下载

    本文档的主要内容详细介绍的是网络调试和串口调试集合UDP TCP客户端TCP服务器端应用程序免费下载。
    发表于 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并发服务器TCP客户端程序免费下载

    本文档的主要内容详细介绍的是Linux网络编程TCP并发服务器TCP
    发表于 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>并发<b class='flag-5'>服务器</b>和<b class='flag-5'>TCP</b><b class='flag-5'>客户端</b>程序免费下载

    STM32+LWIP服务器实现多客户端连接

    用过正点原子LWIP服务器例程开发的朋友可能知道,例程的设计是只支持一个客户端连接的,但实际应用中往往需要用到多客户端连接。下面是在正点原子扩展例程 网络实验14 NETCONN_
    发表于 12-23 19:59 61次下载
    STM32+LWIP<b class='flag-5'>服务器</b>实现多<b class='flag-5'>客户端</b>连接

    服务器Server和客户端Client的区别

    例如在使用TCP通讯建立连接时采用客户端服务器模式,这种模式又常常被称为主从式架构,简称为C/S结构,属于一种网络通讯架构,将通讯的双方以客户端
    的头像 发表于 09-06 16:13 1296次阅读
    <b class='flag-5'>服务器</b>Server和<b class='flag-5'>客户端</b>Client的区别