在Linux系统实现服务器端和客户端的套接字通信

这篇具有很好参考价值的文章主要介绍了在Linux系统实现服务器端和客户端的套接字通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.创建一个socket文件夹用来存放编写的服务器端和客户端程序

二.编写服务器端代码

三.编写客户端代码

四.编译c语言程序

五.断开连接

六.可能涉及到的一些没接触过的知识点

一.创建一个socket文件夹用来存放编写的服务器端和客户端程序

(我系统里的文件在temp/socket$文件夹中)

在Linux系统实现服务器端和客户端的套接字通信

 

二.编写服务器端代码

vim server.c

在server.c中编写的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>//提供IP地址转换函数

int main()
{
    //1.创建监听的套接字
    int fd = socket(AF_INET,SOCK_STREAM, 0);
    if (fd == -1)
    {
        perror("socket");//perror(s) 用来将上一个函数发生错误的原因输出到标准设备,参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno的值来决定要输出的字符串。
        return -1;
    }

    //2.绑定本地的IP port
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;//地址族协议
    saddr.sin_port = htons(9999);//端口必须转换成大端
    saddr.sin_addr.s_addr = INADDR_ANY;//指定IP地址(INADDR_ANY泛指本机的意思,也就是表示本机的所有IP)
    int ret = bind(fd, (struct sockaddr*)&saddr, sizeof(saddr));
    if (ret == -1)//绑定失败 返回-1
    {
        perror("bind");
        return -1;
    }
    //3设置监听
    ret = listen(fd, 128);
    if (ret == -1)
    {
        perror("listen");
        return -1;
    }
    //4阻塞并等待客户端的连接
    struct sockaddr_in caddr;
    int addrlen = sizeof(caddr);
    int cfd = accept(fd, (struct sockaddr*)&caddr,&addrlen );
    if (cfd == -1)
    {
        perror("accept");
        return -1;
    }
    //连接建立成功,打印客户端的IP和端口信息
    char ip[32];
    printf("客户端的ip:%s,端口:%d\n",
        inet_ntop(AF_INET, &caddr.sin_addr.s_addr, ip, sizeof(ip)), ntohs(caddr.sin_port));//网络字节序转换为主机字节序
   
    //5.通信
    while (1)
    {
        //接收数据
        char buff[1024];
        int len = recv(cfd, buff, sizeof(buff), 0);
        if (len > 0)
        {
            printf("client say: %s\n", buff);
            send(cfd, buff, len, 0);
        }
        else if (len == 0)
        {
            printf("客户端已经断开了连接...\n");
            break;
        }
        else
        {
            perror("recv");
            break;
        }
    }
    //关闭文件描述符
    close(fd);
    close(cfd);
    return 0;
}

三.编写客户端代码

vim client.c

在client中编写的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>//提供IP地址转换函数

int main()
{
    //1.创建通信的套接字
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd == -1)
    {
        perror("socket");//perror(s) 用来将上一个函数发生错误的原因输出到标准设备,参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno的值来决定要输出的字符串。
        return -1;
    }

    //2.连接服务器IP port
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;//地址族协议
    saddr.sin_port = htons(9999);//端口必须转换成大端
    inet_pton(AF_INET, "192.168.122.1 ", &saddr.sin_addr.s_addr);
    int ret = connect(fd, (struct sockaddr*)&saddr, sizeof(saddr));
    if (ret == -1)//连接失败 返回-1
    {
        perror("connect");
        return -1;
    }
    
    int number = 0;
    //3.通信
    while (1)
    {
        //发送数据
        char buff[1024];
        sprintf(buff, "你好,hello ,world ,%d...\n", number++);
        send(fd, buff, strlen(buff) + 1, 0);
        //接收数据
        memset(buff, 0, sizeof(buff));
        int len = recv(fd, buff, sizeof(buff), 0);
        if (len > 0)
        {
            printf("server say: %\n", buff);

        }
        else if (len == 0)
        {
            printf("服务器端已经断开了连接...\n");
            break;
        }
        else
        {
            perror("recv");
            break;
        }
        sleep(1);
    }
    //关闭文件描述符
    close(fd);
    return 0;
}

四.编译c语言程序

[itliang@localhost socket]$ gcc client.c -o client
[itliang@localhost socket]$ gcc server.c -o server

 运行server.c程序,先运行服务器端再运行客户端

在Linux系统实现服务器端和客户端的套接字通信

 运行client.c程序,至此客户端与服务器端建立通信,客户端收到服务器端消息,并输出“你好,hello,world”

在Linux系统实现服务器端和客户端的套接字通信 

 服务器端收到客户端消息,并输出“你好,hello,world”

在Linux系统实现服务器端和客户端的套接字通信

 五.断开连接

当服务器端断开连接时,客户端会显示“服务器端已经断开了连接”

在Linux系统实现服务器端和客户端的套接字通信

 当客户端断开连接时,服务器端会显示“客户端已经断开了连接”

 在Linux系统实现服务器端和客户端的套接字通信

 六.可能涉及到的一些没接触过的知识点

perror(s)函数

        用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno的值来决定要输出的字符串。

sockaddr_in在头文件#include<netinet/in.h>或#include <arpa/inet.h>中定义,该结构体解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中,如下:

 

GCC 是 Linux 下的编译工具集,是 GNU Compiler Collection 的缩写,包含 gcc、g++ 等编译器。这个工具集不仅包含编译器,还包含其他工具集,例如 ar、nm 等。

        GCC 工具集不仅能编译 C/C++ 语言,其他例如 Objective-C、Pascal、Fortran、Java、Ada 等语言均能进行编译。GCC 在可以根据不同的硬件平台进行编译,即能进行交叉编译,在 A 平台上编译 B 平台的程序,支持常见的 X86、ARM、PowerPC、mips 等,以及 Linux、Windows 等软件平台。
        有些纯净版的 Linux 默认没有 gcc 编译器,需要自己安装,在线安装步骤如下:

# 安装软件必须要有管理员权限
# ubuntu
$ sudo apt update           # 更新本地的软件下载列表, 得到最新的下载地址
$ sudo apt install gcc g++    # 通过下载列表中提供的地址下载安装包, 并安装

# centos
$ sudo yum update           # 更新本地的软件下载列表, 得到最新的下载地址
$ sudo yum install gcc g++    # 通过下载列表中提供的地址下载安装包, 并安装
gcc 安装完毕之后,可以查看版本:


# 查看 gcc 版本
$ gcc -v
$ gcc --version

# 查看 g++ 版本
$ g++ -v
$ g++ --version

编译:文章来源地址https://www.toymoban.com/news/detail-471269.html

# 参数 -c 是进行文件的汇编, 汇编之前的两步会自动执行
$ gcc test.c -c -o app.o

到了这里,关于在Linux系统实现服务器端和客户端的套接字通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux系统编程,使用C语言实现简单的FTP(服务器/客户端)

    前言 跟着上官社长 陈哥花了一个月的时间终于把Linux系统编程学的差不多了,这一个月真的是头疼啊,各种bug,调的真心心累,不过好在问题都解决掉了,在此也感谢一下答疑老师,给我提供了很多的思路,本文章是对前段时间学习Linux,做一个小小的总结,才疏学浅,只学

    2024年02月12日
    浏览(73)
  • TCP的服务器和客户端的通信

    实现不同主机之间的进程间通信(服务器和客户端的通信),并且一个服务器可以处理很多个客户端的请求。 协议:通信双方所遵守的通信规则。 网络体系结构:指网络的层次结构和每层所使用的协议的集合。 网络采用分而治之的方法设计,将网络的功能划分为不同的模块

    2023年04月23日
    浏览(41)
  • UDP服务器和客户端的创建步骤

    一、创建用户数据报套接字(socket函数): 通信域选择 IPV4网络协议 、套接字类型选择 数据报式 ; 二、填充服务器的网络信息结构体: 1.定义网络信息结构体变量; 2.求出结构体变量的内存空间大小; 3.结构体清零; 4.使用IPV4网络协议; 5.预留给在终端输入的网络字节序

    2024年01月19日
    浏览(42)
  • TCP服务器和客户端的创建步骤

    一、创建套接字(socket函数): 通信域选择IPV4网络协议、套接字类型选择流式; 二、填充服务器的网络信息结构体: 1.定义网络信息结构体变量; 2.求出结构体变量的内存空间大小; 3.结构体清零; 4.使用IPV4网络协议; 5.预留给在终端输入的网络字节序的端口号; 6.预留给

    2024年01月17日
    浏览(41)
  • Qt实践:TCP服务器和客户端的设计

    Qt:5.12.2 Qt Creator:4.11.1 通信方式:TCPIP 语言:C++ 客户端的界面UI包含服务器IP、服务器端口、以及一些简单的功能,数据可选ASCLL及HEX格式。当未与服务器建立连接时,该客户端的部分控件设置为禁用。 \\\'getIp()\\\'函数可以根据不同的操作系统获取本地 IP 地址。在 Windows 系统下

    2024年02月03日
    浏览(44)
  • 【JavaEE初阶】 TCP服务器与客户端的搭建

    TCP服务器与客户端的搭建需要借助以下API TCP之间通信通过流进行传输,无论是服务器还是客户端:读取内容用输入流,写入内容用输出流 ServerSocket 是创建TCP服务端Socket的API。 ServerSocket 构造方法 : 方法签名 方法说明 ServerSocket(int port) 创建一个服务端流套接字Socket,并绑定

    2024年02月05日
    浏览(41)
  • 【Nginx笔记02】通过Nginx服务器转发客户端的WebSocket接口到后端服务

    这篇文章,主要介绍如何通过Nginx服务器转发客户端的WebSocket接口到后端服务【知识星球】。 目录 一、Nginx配置WebSocket 1.1、Nginx配置内容 1.2、客户端请求地址 1.3、创建WebSocket测试工程 1.4、启动测试 1.5、WebSocket超时问题 1.5.1、设置超时时间 1.5.2、建立心跳机制(推荐) 今天

    2024年04月11日
    浏览(48)
  • 服务器端使用django websocket,客户端使用uniapp 请问服务端和客户端群组互发消息的代码怎么写的参考笔记

    2023/8/29 19:21:11 服务器端使用django websocket,客户端使用uniapp 请问服务端和客户端群组互发消息的代码怎么写 2023/8/29 19:22:25 在服务器端使用Django WebSocket和客户端使用Uniapp的情况下,以下是代码示例来实现服务器端和客户端之间的群组互发消息。 服务器端代码 (使用Django Chann

    2024年02月11日
    浏览(46)
  • 【计算机网络】网络编程套接字&UDP服务器客户端的简单模拟

    需要云服务器等云产品来学习Linux的同学可以移步/–腾讯云–/官网,轻量型云服务器低至112元/年,优惠多多。(联系我有折扣哦) 每台主机都有自己的IP地址,当数据在进行通信的时候,除了要发送的数据外,在报头里面还要包含发送方的IP和接收方的IP,这里发送方的IP就

    2024年02月20日
    浏览(64)
  • FRP内网穿透参数配置+服务器与客户端的简易配置+完整配置详解(Windows)

    有设备A,想访问处于局域网的设备C时,可以通过处在公网的设备B进行转发 前提条件:一个有公网IP的电脑,云服务器、有公网IPV4/6的设备均可,如果使用ipv6模式,那么设备BC都必须支持ipv6才行,ipv6地址除了bind_addr和server_addr,都要用[]括起来 本文基于:v0.48.0版本 官网: 官

    2024年02月05日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包