linux 编程 ———网络编程(Socket 编程)客户端与服务端实现源码

2023-05-16

文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。


笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。
如果存在相关知识点的遗漏,可以在评论区留言,看到后将在第一时间更新。
作者:Aliven888

客户端

// client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
#define SERVER_PORT 20001
#define SERVER_IP "127.0.0.1"

int main()
{
    int sock_fd;
    struct sockaddr_in addr_server;
    if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("socket");
        exit(1);
    }
    printf("sock successful\n");

    //设置socket参数, 根据需求选择自己需要的
    {
        // 1.设置调用close(socket)后,仍可继续重用该socket。调用close(socket)一般不会立即关闭socket,而经历TIME_WAIT的过程。
        bool bReuseaddr = TRUE;
        setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&bReuseaddr, sizeof(bool) );
        // 2. 如果要已经处于连接状态的soket在调用closesocket()后强制关闭,不经历TIME_WAIT的过程:
        BOOL bDontLinger = FALSE;
        setsockopt(sock_fd, SOL_SOCKET, SO_DONTLINGER, (const char*)&bDontLinger, sizeof(bool));

        //3. 超时等待设置
        int iSecond = 1;
        setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&iSecond, sizeof(iSecond));  //recv timeout
        setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, (const char*)&iSecond, sizeof(iSecond));  //send timeout

        //4. 缓冲区设置
        // socket缓冲区的概念:
        //      socket编程基于传输层,是应用层和传输层之间的一个抽象层。在使用socket API时,
        //      实际上每创建一个socket,都会分配两个缓冲区,输入缓冲区和输出缓冲区(大小一般是8K),
        //      Linux下一切皆文件的思想,两台主机在进行通信时,write函数是向缓冲区里写,read函数是从缓冲区里读,
        //      至于缓冲区里的数据什么时候被传输,有没有达到目标主机,这些都交给传输层的TCP/UDP来做。
        int iRecvBufLen = 32 * 1024; //设置为32K
        setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, (const char*)&iRecvBufLen, sizeof(int) );

        int iSendBufLen = 32*1024; //设置为32K
        setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, (const char*)&iSendBufLen, sizeof(int) );

        // 5.在发送数据的时,不执行由系统缓冲区到socket缓冲区的拷贝,以提高程序的性能:
        int iZero = 0;
        setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, (char *)&iZero, sizeof(iZero) );
        
        // 6.在接收数据时,不执行将socket缓冲区的内容拷贝到系统缓冲区:
        int iZero = 0;
        setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, (char *)&iZero, sizeof(int) );
        
        // 7.一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:
        bool bBroadcast = true;
        setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, (const char*)&bBroadcast, sizeof(bool));

        // 8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时,直到accpet()被调用(此设置只
        // 有在非阻塞的过程中有显著的作用,在阻塞的函数调用中作用不大)
        bool bConditionalAccept = true;
        setsockopt(sock_fd, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (const char*)&bConditionalAccept, sizeof(bool));

        // 9.如果在发送数据的过程中send()没有完成,还有数据没发送,而调用了close(socket),以前一般采取的措施是shutdown(s,SD_BOTH),但是数
        // 据将会丢失。 某些具体程序要求待未发送完的数据发送出去后再关闭socket,可通过设置让程序满足要求:
        struct linger {
        u_short l_onoff;
        u_short l_linger;
        };
        struct linger m_sLinger;
        m_sLinger.l_onoff = 1; //在调用close(socket)时还有数据未发送完,允许等待
        // 若m_sLinger.l_onoff=0;则调用closesocket()后强制关闭
        m_sLinger.l_linger = 5; //设置等待时间为5秒
        setsockopt(sock_fd, SOL_SOCKET, SO_LINGER, (const char*)&m_sLinger, sizeof(struct linger));
    }

 
    memset(&addr_server, 0, sizeof(addr_server));
    addr_server.sin_family = AF_INET;
    addr_server.sin_port = htons(SERVER_PORT);
    addr_server.sin_addr.s_addr = inet_addr(SERVER_IP);
 
    if(connect(sock_fd, (struct sockaddr *)&addr_server, sizeof(struct sockaddr))<0)
    {
        perror("connect");
        exit(1);
    }
    printf("connect successful\n");
    send(sock_fd, "ok", 2, 0);

    //如果需要接收数据的话,可以再加个 recv
    //int len = recv(sock_fd, buf, sizeof(buf), 0);
    //处理 recv 接收的内容
    
    close(sock_fd);
}

服务端

// server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
#define PORT 20001
 
int main()
{
    int sock_fd, client_fd;
    int addr_client_len;
    struct sockaddr_in addr_server, addr_client;
	
    addr_client_len = sizeof(struct sockaddr);
    if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("socket");
        exit(1);
    }
    printf("sock successful\n");

    //设置socket参数, 根据需求选择自己需要的
    {
        // 1.设置调用close(socket)后,仍可继续重用该socket。调用close(socket)一般不会立即关闭socket,而经历TIME_WAIT的过程。
        bool bReuseaddr = TRUE;
        setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&bReuseaddr, sizeof(bool) );
        // 2. 如果要已经处于连接状态的soket在调用closesocket()后强制关闭,不经历TIME_WAIT的过程:
        BOOL bDontLinger = FALSE;
        setsockopt(sock_fd, SOL_SOCKET, SO_DONTLINGER, (const char*)&bDontLinger, sizeof(bool));

        //3. 超时等待设置
        int iSecond = 1;
        setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&iSecond, sizeof(iSecond));  //recv timeout
        setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, (const char*)&iSecond, sizeof(iSecond));  //send timeout

        //4. 缓冲区设置
        // socket缓冲区的概念:
        //      socket编程基于传输层,是应用层和传输层之间的一个抽象层。在使用socket API时,
        //      实际上每创建一个socket,都会分配两个缓冲区,输入缓冲区和输出缓冲区(大小一般是8K),
        //      Linux下一切皆文件的思想,两台主机在进行通信时,write函数是向缓冲区里写,read函数是从缓冲区里读,
        //      至于缓冲区里的数据什么时候被传输,有没有达到目标主机,这些都交给传输层的TCP/UDP来做。
        int iRecvBufLen = 32 * 1024; //设置为32K
        setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, (const char*)&iRecvBufLen, sizeof(int) );

        int iSendBufLen = 32*1024; //设置为32K
        setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, (const char*)&iSendBufLen, sizeof(int) );

        // 5.在发送数据的时,不执行由系统缓冲区到socket缓冲区的拷贝,以提高程序的性能:
        int iZero = 0;
        setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, (char *)&iZero, sizeof(iZero) );
        
        // 6.在接收数据时,不执行将socket缓冲区的内容拷贝到系统缓冲区:
        int iZero = 0;
        setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, (char *)&iZero, sizeof(int) );
        
        // 7.一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:
        bool bBroadcast = true;
        setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, (const char*)&bBroadcast, sizeof(bool));

        // 8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时,直到accpet()被调用(此设置只
        // 有在非阻塞的过程中有显著的作用,在阻塞的函数调用中作用不大)
        bool bConditionalAccept = true;
        setsockopt(sock_fd, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (const char*)&bConditionalAccept, sizeof(bool));

        // 9.如果在发送数据的过程中send()没有完成,还有数据没发送,而调用了close(socket),以前一般采取的措施是shutdown(s,SD_BOTH),但是数
        // 据将会丢失。 某些具体程序要求待未发送完的数据发送出去后再关闭socket,可通过设置让程序满足要求:
        struct linger {
        u_short l_onoff;
        u_short l_linger;
        };
        struct linger m_sLinger;
        m_sLinger.l_onoff = 1; //在调用close(socket)时还有数据未发送完,允许等待
        // 若m_sLinger.l_onoff=0;则调用closesocket()后强制关闭
        m_sLinger.l_linger = 5; //设置等待时间为5秒
        setsockopt(sock_fd, SOL_SOCKET, SO_LINGER, (const char*)&m_sLinger, sizeof(struct linger));
    }
 
    memset(&addr_server, 0, sizeof(addr_server));
    addr_server.sin_family = AF_INET;
    addr_server.sin_port = htons(PORT);
    addr_server.sin_addr.s_addr = htonl(INADDR_ANY);
 
    if(bind(sock_fd, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) < 0)
    {
        perror("bind");
        exit(1);
    }
 
    printf("bind sucessful\n");
 
    if(listen(sock_fd, 5))
    {
        perror("listen");
        exit(1);
    }
    printf("listen sucessful\n");
    char buf[1024];
    while(1)
    {
	memset(buf, '\0', 1024);
        if((client_fd = accept(sock_fd, (struct sockaddr *)&addr_client, &addr_client_len)) < 0)
        {
            perror("accept");
            exit(1);		
        }
	int len = recv(client_fd, buf, sizeof(buf), 0);
	//char *buf = new(std::nothrow) char[1024];
	//recv(client_fd, buf, 1024);
        printf("accept client ip: %s : %s\n", inet_ntoa(addr_client.sin_addr), buf);
        send(client_fd, "ok", 2, 0);
        close(client_fd);
	//delete buf;
	//buf = null;
    }
    close(sock_fd);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux 编程 ———网络编程(Socket 编程)客户端与服务端实现源码 的相关文章

  • 毕设——基于人脸表情识别的桌面交互精灵设计(分享一下成果,附上人脸表情的数据集和自己训练出来yolov5模型以及基于PYQT5运行yolov5的交互界面)

    说明 xff1a 下载人太多 xff0c 网盘链接容易失效 xff0c 我放到了我的资源里面 xff0c 内容包括源代码和模型 xff0c 数据集还是通过网盘自取 xff01 CSDN资源链接 目录 一 前言二 说说论文三 说说设计本身四
  • 【嵌入式笔/面试】嵌入式软件基础题和真题总结——操作系统

    在学习的时候找到几个十分好的工程和个人博客 xff0c 先码一下 xff0c 内容都摘自其中 xff0c 有些重难点做了补充 xff01 才鲸 嵌入式软件笔试题汇总 嵌入式与Linux那些事 阿秀的学习笔记 小林coding 百问网linu
  • 【嵌入式笔/面试】嵌入式软件基础题和真题总结——网络相关

    在学习的时候找到几个十分好的工程和个人博客 xff0c 先码一下 xff0c 内容都摘自其中 xff0c 有些重难点做了补充 xff01 才鲸 嵌入式软件笔试题汇总 嵌入式与Linux那些事 阿秀的学习笔记 小林coding 百问网linu
  • 【嵌入式笔/面试】嵌入式软件基础题和真题总结——单片机与Linux

    在学习的时候找到几个十分好的工程和个人博客 xff0c 先码一下 xff0c 内容都摘自其中 xff0c 有些重难点做了补充 xff01 才鲸 嵌入式软件笔试题汇总 嵌入式与Linux那些事 阿秀的学习笔记 小林coding 百问网linu
  • 12、AD模数转换

    一 A D转换器的主要技术指标 1 分辨率 ADC的分辨率是指使输出数字量变化一个相邻数码所需输入模拟电压的变化量 常用二进制的位数表示 例如12位ADC的分辨率就是12位 xff0c 或者说分辨率为满刻度的1 2 12 一个10V满刻度的
  • 安装了双系统,Ubuntu未显示WiFi连接,无法上网怎么办,以及windows无法上网怎么办

    我最近刚装了双系统 xff0c 但是当我登录上Ubuntu系统时 xff0c 却没有看到WiFi图标显示 xff0c 没法连接网络 于是输入下面命令进行操作 xff0c 就恢复了 大家可以参考一下 更新并激活网卡 xff1a 1 首先打开终
  • CMakeLists.txt中FIND_PACKAGE()是如何工作的?

    官方文档 xff1a https cmake org cmake help latest command find package html FIND PACKAGE lt PackageName gt 如何查找头文件和库文件路径 xff1
  • 头文件中应该写什么

    通 过上面的讨论 xff0c 我们可以了解到 xff0c 头文件的作用就是被其他的 cpp 包含进去的 它们本身并不参与编译 xff0c 但实际上 xff0c 它们的内容却在多个 cpp 文件中得到了 编译 通过 定义只能有一次 的规则 x
  • ubuntu下编译报错:对‘cv::String::deallocate()’未定义的引用

    在编译包含opencv头文件的程序时报错1 xff0c 如下 xff1a home jie cadmus ws devel lib libdeebot slam so xff1a 对 cv String allocate span clas
  • MDK软件仿真使用

    开始仿真前需要先配置环境 xff0c 如果手动创建环境不能进入仿真要考虑去看一下工程配置选项的问题 xff0c 本次仿真使用AT32F403VGT7型号 xff0c 如图 xff1a 点击开始仿真 xff0c 下面对仿真工具栏的选项进行具体
  • SK6812驱动入门

    我看数据手册一般是特性 引脚定义 外围电路 时序图以及驱动代码 特性 Top SMD内部集成高质量外控单线串行级联恒流IC xff1b 控制电 与芯片集成在SMD 3528元器件中 xff0c 构成一个完整的外控像素点 色温效果均匀且一致性
  • ESD与TVS的区别

    概念 ESD全称是Electro Static discharge 意思就是 静电释放 国际上习惯将用于静电防护的器材统称为ESD 中文名称为静电阻抗器 TVS全称是Transient Voltage Suppressor 意思是 瞬间电压
  • 开关电源三种控制模式:PWM/PFM/PSM

    1 PWM PFM PSM 三种控制模式的定义 通常来说 开关电源 xff08 DC DC xff09 有三种最常见的调制方式分别为 xff1a 脉冲宽度调制 xff08 PWM xff09 脉冲频率调制 xff08 PFM xff09 脉
  • PCB布线走直角或锐角问题研究

    首先需要说明的一点 xff0c 在正常布线的过程中还是要尽量避免布线走直角和锐角 这里只是研究深入下布线走直角或锐角会有多大的危害性 xff0c 结尾给出答案 无论是教科书还是公司的技术规范都会强调布线避免出现走直角和锐角 xff0c 不过
  • 磁珠基本原理

    概念 磁珠的全称为铁氧体磁珠滤波器 xff0c 是一种抗干扰元件 xff0c 主要功能是滤除高频噪声 xff0c 消除存在于传输线结构 xff08 电路 xff09 中的噪声 工作原理 磁珠通过阻抗吸收并以发热的形式将不需要频段的能量耗散掉
  • BUCK型DC-DC变换器

    前述 DCDC从控制手段上来说分为PWM式 谐振式以及他们的结合式 每 一种方式中从输入与输出之间是否有变压器隔离又可以分为有隔离 无隔离两类 每一类有六种拓扑结构 BUCK Boost BUCK Boost Cuk Sepic和Zeat
  • dubbo服务超时导致的异常org.apache.dubbo.remoting.TimeoutException

    1 dubbo服务超时异常提示信息如下 xff1a cause org apache dubbo remoting TimeoutException Waiting server side response timeout by scan
  • 基于TCP/IP实现串口到网络的通讯转换

    工作模式 通过串口服务器 xff0c 采集到天平的称量值发送到PC端 操作步骤 1 软件测试 测试工具 xff1a USR M0 V2 2 5 8 基础设置 xff1a 模块静态IP 设置成服务器IP xff0c HTTP服务端口 设置成4
  • 结构体的对其规则以及为什么要对其

    结构体的内存对齐规则以及为什么要对齐 内存对齐规则 span class token number 1 span 第一个成员在与结构体变量偏移量为 span class token number 0 span 的地址处 span class
  • 宏定义参数

    宏定义的参数以逗号 xff08 作为分隔符 span class token macro property span class token directive keyword include span span class token s

随机推荐

  • [STM32]关于环形队列的实现

    在程序中使用环形队列判断接收数据格式 xff0c 避免在中断中处理造成程序响应速度慢的问题 直接贴代码 xff1a LoopRxCommu h ifndef LOOPRXCOMMU H define LOOPRXCOMMU H includ
  • C#旅程——串口发送数据

    串口发送数据时可以一个byte一个byte的发送数据 xff0c 也可以一次性丢出 xff0c 分多次丢出的话会导致一段数据被分成多段发出 xff0c 中间的延时可能会超过2ms xff0c 与FW通讯时会出现异常 span class t
  • 【记录】一次51单片机串口乱码问题排查

    记录 一次51单片机串口乱码问题排查 项目场景问题描述原因分析解决方案结语 项目场景 在51串口收发仿真实验中使用两个单片机互相通信 xff0c 程序设定A上电1s后通过串口以16进制给B发送AA 直到B收到AA后回复BB xff0c 当A
  • IO流java基础

    二十四 IO流 24 1 File 1 1 File 类概述和构造方法 File 它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的 对于File而言 其封装的并不是一个真正存在的文件 仅仅是一个路径名而已 它可以是存
  • TX2上布置vins_fusion_gpu指南

    1 参考链接 如果初次安装 xff0c 新的TX2环境 xff0c 请参考文档 https github com arjunskumar vins fusion gpu tx2 nano 2 问题记录 1 xff0c 自己的环境情况 我的环
  • Ubuntu下安装cmake

    Ubuntu下安装cmake 今天因为项目的原因需要将cmake升级一下 xff0c 原来我是按照链接没有卸载旧版本 xff0c 直接升级 但是出现一些问题 xff0c 然后我全部卸载后 xff0c 重新安装 以下就是我的安装步骤 第一步
  • AUTH:basic认证和digest认证

    Http authentication BASIC In the context of an HTTP transaction basic access authentication is a method for a web browse
  • Quick Audience组织和工作空间功能解读

    简介 xff1a Quick Audience完成了权限系统全面升级 xff0c 可以解决集团企业不同品牌 不同运营组织 xff0c 不同消费者运营的诉求 xff0c 精细化保障企业数据访问安全 xff0c 提升管控的灵活度 更多关于数智化
  • Socket编程基础总结,全网最全

    IP地址 xff1a 可以在网络环境中 xff0c 唯一标识一台主机 端口号 xff1a 可以定位网络的一台主机上 xff0c 唯一标识一个进程 ip地址 43 端口号 xff1a 可以在网络环境中 xff0c 唯一标识一个进程 在TCP
  • 嵌入式开发--RS-485通讯的问题

    嵌入式开发 RS 485通讯的问题 RS 485说明接口芯片硬件连接CubeMX设置代码编写引脚定义使能串口中断函数发送数据接收数据 有一个问题 xff0c 多收了一个数数据线上的波形问题分析问题解决 RS 485说明 RS 485一般简称
  • UNIX网络编程卷1(第三版)字节排序函数测试

    内存中存储多字节有两种方法 xff0c 即小端字节序和大端字节序 xff0c Ubuntu10 04 是小端字节序 xff0c 网际协议所用的字节序为大端字节序 内存地址增长方向 低序字节 gt 高序字节 小端字节序 高序字节 gt 低序字
  • android非常好的在线视频播放器源码(包含在线音频播放源码)

    一 在线音频播放器 lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34 gt lt LinearLayout xmlns android 61 34 http schemas androi
  • 深入理解任务堆栈

    先来看这一个小函数 xff0c 猜猜他的运行结果 VC6环境 xff1f include lt stdio h gt void b int data 10 printf 34 helloworld r n 34 data 11 61 5 i
  • Protel99seMEX3

    Protel99se的鼠标增强软件 xff0c 可以实现用鼠标放大与缩小电路图 xff0c 十分方便 xff01 文件 xff1a n459 com file 25127180 478161061 以下内容无关 xff1a 分割线 说起Al
  • 基于C++的http服务端开发

    1 同时支持get post接口请求 2 支持文件流下载接口 完整源代码下载地址 xff1a https download csdn net download GUMU12345 81103130 sample cc Copyright c
  • Psychtoolbox SYNCHRONIZATION FAILURE问题

    参考 xff1a http psychtoolbox org docs SyncTrouble 写这篇文章的原因是自己遇见了这个问题 xff0c 并且换了两台电脑都不行 xff0c 有点烦了 xff0c 决心把它弄清楚是怎么回事 因为我的主
  • vscode写python切换虚拟环境,解释器没有不变的问题

    在用vscode写python代码 xff0c 可以使用anaconda进行虚拟环境的管理 而在vscode中使用Ctrl 43 Shift 43 P的方式调出终端 搜索即可搜索到相关设置 xff0c vscode中的python插件会自动
  • MVVM WPF 绑定颜色

    lt Button Margin 61 34 2 34 Width 61 34 10 34 gt lt Button Background gt lt SolidColorBrush Color 61 34 Binding Path 61
  • Android Handler

    Handler 和 Looper关系 Handler是对我们需要线程执行的一类任务的处理管理类 xff0c 而Looper是android线程所拥有的循环心跳行为的管理类 xff0c 例如主线程就是在一开始就执行了Looper loop x
  • linux 编程 ———网络编程(Socket 编程)客户端与服务端实现源码

    文档声明 xff1a 以下资料均属于本人在学习过程中产出的学习笔记 xff0c 如果错误或者遗漏之处 xff0c 请多多指正 并且该文档在后期会随着学习的深入不断补充完善 感谢各位的参考查看 笔记资料仅供学习交流使用 xff0c 转载请标明