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

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

一、前言

互联网概念诞生于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 <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

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 <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
struct sockaddr {
   sa_family_t sa_family;
   char        sa_data[14];
}

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

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

#define _GNU_SOURCE             /* See feature_test_macros(7) */
#include <sys/socket.h>
int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

三、案例代码

3.1 创建TCP服务器

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

/*
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 <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

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

*/
int main(int argc,char **argv)
{   
    if(argc!=3)
    {
        printf("./app  <IP地址> <端口号>\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;
}
目录
相关文章
|
14天前
|
网络协议 网络架构
【网络编程入门】TCP与UDP通信实战:从零构建服务器与客户端对话(附简易源码,新手友好!)
在了解他们之前我们首先要知道网络模型,它分为两种,一种是OSI,一种是TCP/IP,当然他们的模型图是不同的,如下
|
6天前
|
网络协议 安全 Python
我们将使用Python的内置库`http.server`来创建一个简单的Web服务器。虽然这个示例相对简单,但我们可以围绕它展开许多讨论,包括HTTP协议、网络编程、异常处理、多线程等。
我们将使用Python的内置库`http.server`来创建一个简单的Web服务器。虽然这个示例相对简单,但我们可以围绕它展开许多讨论,包括HTTP协议、网络编程、异常处理、多线程等。
|
14天前
|
网络协议 Linux
云服务器内部端口占用,9090端口已经存在了,如何关闭,Linux查询端口,查看端口,端口查询,关闭端口写法-netstat -tuln,​fuser -k 3306/tcp​
云服务器内部端口占用,9090端口已经存在了,如何关闭,Linux查询端口,查看端口,端口查询,关闭端口写法-netstat -tuln,​fuser -k 3306/tcp​
|
16天前
|
网络协议 网络安全
使用NetAssist网络调试助手在单台计算机上配置TCP服务器和客户端
使用NetAssist网络调试助手在单台计算机上配置TCP服务器和客户端
35 0
|
9天前
|
云安全 安全 网络安全
云计算与网络安全:技术挑战与未来方向
【7月更文挑战第10天】 随着信息技术的飞速发展,云计算已成为企业和个人数据存储、处理的首选平台。然而,云服务的普及也带来了前所未有的网络安全挑战。本文将深入探讨云计算在提供灵活性和可扩展性的同时,如何应对日益复杂的网络安全威胁。我们将分析当前云服务中存在的安全漏洞,讨论最新的防御策略,并展望未来云计算安全技术的发展趋势。通过案例分析和专家访谈,本文旨在为读者提供一个全面的云计算安全现状和未来展望的视角。
|
2天前
|
存储 安全 网络安全
云计算与网络安全:技术挑战与解决方案
【7月更文挑战第17天】在数字化时代,云计算已成为企业和个人数据存储、处理和计算的重要工具。然而,随着云服务的广泛应用,网络安全问题也日益突出。本文将探讨云计算环境下的网络安全挑战,包括数据泄露、服务中断和恶意软件攻击等,并提出相应的解决策略,如加强身份验证、实施加密措施和采用分布式拒绝服务(DDoS)防护。文章旨在为读者提供对云计算网络安全风险的深入理解和有效防御手段。
|
3天前
|
存储 安全 网络安全
云计算与网络安全:技术挑战与未来趋势
随着云计算技术的迅猛发展,其在各行各业的应用日益广泛。然而,云计算的普及也带来了前所未有的网络安全挑战。本文深入探讨了云服务、网络安全和信息安全等技术领域,分析了当前云计算环境中存在的安全威胁,并提出了相应的防护措施。同时,文章还预测了云计算与网络安全未来的发展趋势,为相关领域的研究者和实践者提供了有价值的参考。
|
2天前
|
存储 安全 网络安全
云计算与网络安全:技术挑战与策略
【7月更文挑战第17天】在数字化时代,云计算已成为企业存储、处理和分析数据的首选平台。然而,随着云服务的快速发展,网络安全威胁也随之增加,对信息安全构成了前所未有的挑战。本文将深入探讨云计算环境中的网络安全问题,包括数据泄露、身份盗用、恶意软件攻击等,并分析当前云服务供应商采取的安全措施。此外,文章还将讨论如何通过加强加密技术、实施严格的访问控制策略、采用多因素认证、部署入侵检测系统以及进行定期安全评估来提高云环境的安全性。最后,本文将强调企业和云服务提供商之间合作的重要性,以确保云计算平台的持续安全。
14 5
|
4天前
|
人工智能 安全 网络安全
云计算与网络安全:技术融合与挑战探索
【7月更文挑战第15天】在数字化浪潮的推动下,云计算服务已成为企业信息技术架构的核心。然而,随着云服务的广泛应用,网络安全问题亦随之凸显,成为制约其发展的关键因素。本文旨在探讨云计算与网络安全的技术融合点与面临的挑战,分析信息安全在云环境中的实践策略,并展望未来技术的发展趋势。通过对现有文献的综合分析与实际案例研究,文章揭示了云服务模型、网络安全框架及信息安全措施之间的相互作用,为读者提供了一幅云计算与网络安全交织的全景图。