linux socket编程以及简单的tcp,udp的例子

2023-05-16

linux socket编程以及简单的tcp,udp的例子

通过socket编程大致对网路编程的脉络有个大致的了解,如果有不太懂的地方,
咱们可以到网络上查找手册

socket的基本操作

创建socket

int socket(int domain, int type, int protocol);  
1. domain 指定使用何种的地址类型
    协议  说明
    PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL   UNIX 进程通信协议
    PF_INET/AF_INET Ipv4 网络协议
    PF_INET6/AF_INET6   Ipv6 网络协议
    PF_IPX/AF_IPX IPX-Novell    协议
    PF_NETLINK/AF_NETLINK   核心用户接口装置
    PF_X25/AF_X25   ITU-T X. 25/ISO-8208 协议
    PF_AX25/AF_AX25 业余无线AX. 25 协议
    PF_ATMPVC/AF_ATMPVC 存取原始 ATM PVCs
    PF_APPLETALK/AF_APPLETALK   appletalk (DDP)协议
    PF_PACKET/AF_PACKET 初级封包接口
    PF_INET/AF_INET Ipv4 网络协议
    PF_INET/AF_INET Ipv4 网络协议

2. type的类别。见表:
    类型  说明
    SOCK_STREAM 提供双向连续且可信赖的数据流, 即TCP
    SOCK_DGRAM  使用不连续不可信赖的数据包连接
    SOCK_SEQPACKET  提供连续可信赖的数据包连接
    SOCK_RAW    提供原始网络协议存取
    SOCK_RDM    提供可信赖的数据包连接
    SOCK_PACKET 提供和网络驱动程序直接通信

3. protocol 用来指定socket 所使用的传输协议编号,通常为0

成功返回0 失败返回-1

命名socket

int bind(int sockfd, struct sockaddr * my_addr, int addrlen);  
0 正确
常用的错误:EACCES,EADDRINUSE

监听socket–创建一个监听队列

int liseten(int socketfd,int backlog)

接受连接

accet(int socketfd,struct sockaddr * my_addr, int addrlen)

从队列中接受一个连接

发起连接

connect(int socketfd,struct sockaddr * my_addr, int addrlen)

关闭连接

close(int fd)

tcp数据读写

recv(int fd,void*buf,size_t len,int flags)
send(int fd,const void *buf,size_t len,int flags)
flag 有一些特别的参数
    持续监听对方的回应
     不经过路由表
     对socket非阻塞
     发送紧急数据
     不接受sig信号等等

udp数据读写

recvfrom(int fd,void*buf,size_t len,int flags,struct sockaddr * my_addr, int addrlen)

sendto(int fd,const void*buf,size_t len,int flags,struct sockaddr * my_addr, int addrlen)

通用数据读写

recvmsg(int fd,struct msghdr*msg,int flags);
sendmsg(int fd,struct msghdr*msg,int flags);
struct msghdr
{
    void* msg_name;
    socklen_t msg_namelen;
    struct iovec*msg_iov;
    int msg_iovlen;
    void* msg_control;
    socklen_t msg_controllen;
    int msg_flags;
};

struct iovec
{
    void *iov_base;
    size_t iov_len;
};

带外标记判断

int sockatmark(int sockfd);

地址信息函数

int getsockname(int socketfd,struct sockaddr * my_addr, int addrlen);//本端的地址信息
int getpeername(int socketfd,struct sockaddr * my_addr, int addrlen);//远端的地址信息

socket选项

获取socket选项
getsockopt(int socketfd,int opt_name,void*option_value,socket_t restrict option_len)
设置socket选项
getsockopt(int socketfd,int opt_name,void*option_value,socket_t restrict option_len)

这个可以查看手册。
选项名称        说明                  数据类型
========================================================================
            SOL_SOCKET
------------------------------------------------------------------------
SO_BROADCAST      允许发送广播数据            int
SO_DEBUG        允许调试                int
SO_DONTROUTE      不查找路由               int
SO_ERROR        获得套接字错误             int
SO_KEEPALIVE      保持连接                int
SO_LINGER        延迟关闭连接              struct linger
SO_OOBINLINE      带外数据放入正常数据流         int
SO_RCVBUF        接收缓冲区大小             int
SO_SNDBUF        发送缓冲区大小             int
SO_RCVLOWAT       接收缓冲区下限             int
SO_SNDLOWAT       发送缓冲区下限             int
SO_RCVTIMEO       接收超时                struct timeval
SO_SNDTIMEO       发送超时                struct timeval
SO_REUSERADDR      允许重用本地地址和端口         int
SO_TYPE         获得套接字类型             int
SO_BSDCOMPAT      与BSD系统兼容              int
========================================================================
            IPPROTO_IP
------------------------------------------------------------------------
IP_HDRINCL       在数据包中包含IP首部          int
IP_OPTINOS       IP首部选项               int
IP_TOS         服务类型
IP_TTL         生存时间                int
========================================================================
            IPPRO_TCP
------------------------------------------------------------------------
TCP_MAXSEG       TCP最大数据段的大小           int
TCP_NODELAY       不使用Nagle算法             int
========================================================================

获取主机信息

根据名字获取主机信息
struct hostent* gethostbyname(const char *name)
根据ip获取主机信息
struct hostent* gethostbyaddr(const void *addr,size_t len,int type)
struct hostent
{
    char *h_name;//主机名
    char** h_aliases;//主机别名,可能有多个
    int h_addrtype;//地址类型
    int h_length;// 地址长度
    char ** h_addr_list//按照网络字节序列列出idp地址列表
}

获取服务信息

//根据 名字,端口号获取服务信息
struct servent*getservbyname(const char *name,const char *proto);
//根据服务类型,端口号获取服务信息
struct servent*getservbyport(int port,const char *proto);
    struct servent{
        char *h_name;//主机名
        char** h_aliases;//主机别名,可能有多个
        int  s_port;//端口号
        char *s_proto;//服务类型,tcp或者upd等

    }

通过主机名获取ip地址

int getaddrinfo( const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result );

通过socket地址获取主机名

int getnameinfo (const struct sockaddr *sockaddr, socklen_t addrlen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags) ;

tcp编程的例子server

//
//  main.cpp
//  linux_socket_api
//
//  Created by bikang on 16/11/2.
//  Copyright (c) 2016年 bikang. All rights reserved.
//

#include <iostream>

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>

//using namespace std;

#define BUFFER_SIZE 1024


void tsocket(int argc, const char * argv[]);

int main(int argc, const char * argv[]) {
    tsocket(argc,argv);
    return 0;
}
void tsocket(int argc, const char * argv[]){
    if(argc < 3){
        exit(-1);
    }

    const char* ip = argv[1];
    int port = atoi(argv[2]);
    int backlog = atoi(argv[3]);

    std::cout << "ip=" << ip << " port="<<port << " backlog=" << backlog  << std::endl;

    int fd;
    int check_ret;

    fd = socket(PF_INET,SOCK_STREAM , 0);
    assert(fd >= 0);

    struct sockaddr_in address;
    bzero(&address,sizeof(address));

    //转换成网络地址
    address.sin_port = htons(port);
    address.sin_family = AF_INET;
    //地址转换
    inet_pton(AF_INET, ip, &address.sin_addr);
    //设置socket buffer大小
    int recvbuf = 4096;
    int len = sizeof( recvbuf );
    setsockopt( fd, SOL_SOCKET, SO_RCVBUF, &recvbuf, sizeof( recvbuf ) );
    getsockopt( fd, SOL_SOCKET, SO_RCVBUF, &recvbuf, ( socklen_t* )&len );
    printf( "the receive buffer size after settting is %d\n", recvbuf );



    //绑定ip和端口
    check_ret = bind(fd,(struct sockaddr*)&address,sizeof(address));
    assert(check_ret >= 0);

    //创建监听队列,用来存放待处理的客户连接
    check_ret = listen(fd, backlog);
    assert(check_ret >= 0);

    struct sockaddr_in addressClient;
    socklen_t clientLen = sizeof(addressClient);
    //接受连接,阻塞函数
    int connfd = accept(fd, (struct sockaddr*)&addressClient, &clientLen);
    if(connfd < 0){
        std::cout << "accept error";
    }else{
        //打印客户端信息
        char showData[INET_ADDRSTRLEN];
        std::cout <<inet_ntop(AF_INET,&addressClient.sin_addr,showData,INET_ADDRSTRLEN)<<":" <<ntohs(addressClient.sin_port)<<std::endl;

        //接受数据
        const int BUF_LEN = 1024;
        char sockBuf[BUF_LEN];
        size_t ret;

        memset(sockBuf, '\0', BUF_LEN);
        ret = recv(connfd, sockBuf, BUF_LEN-1, 0);
        printf("ret=%ld,msg=%s\n",ret,sockBuf);

        memset(sockBuf, '\0', BUF_LEN);
        ret = recv(connfd, sockBuf, BUF_LEN-1, MSG_OOB);
        printf("ret=%ld,msg=%s\n",ret,sockBuf);

        memset(sockBuf, '\0', BUF_LEN);
        ret = recv(connfd, sockBuf, BUF_LEN-1, 0);
        printf("ret=%ld,msg=%s\n",ret,sockBuf);

        //获取本地socket信息
        struct sockaddr_in tmpAddress;
        clientLen = sizeof(tmpAddress);
        getsockname(fd, (struct sockaddr*)&tmpAddress, &clientLen);
        std::cout <<inet_ntop(AF_INET,&tmpAddress.sin_addr,showData,INET_ADDRSTRLEN)<<":" <<ntohs(tmpAddress.sin_port)<<std::endl;
        //获取远端socket信息
        getpeername(connfd,(struct sockaddr*)&tmpAddress, &clientLen );
        std::cout <<inet_ntop(AF_INET,&tmpAddress.sin_addr,showData,INET_ADDRSTRLEN)<<":" <<ntohs(tmpAddress.sin_port)<<std::endl;



        close(connfd);
    }

    close(fd);
}

tcp编程的例子client

//
//  main.cpp
//  linux_socket_api_client
//
//  Created by bikang on 16/11/2.
//  Copyright (c) 2016年 bikang. All rights reserved.
//
#include <iostream>

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>


void tserver(int argc, const char * argv[]);

int main(int argc, const char * argv[]) {
    tserver(argc,argv);
    return 0;
}
void tserver(int argc, const char * argv[]){
    std::cout << "t server" << std::endl;
    if(argc < 3){
        exit(-1);
    }

    const char* ip = argv[1];
    int port = atoi(argv[2]);
    int backlog = atoi(argv[3]);

    std::cout << "ip=" << ip << " port="<<port << " backlog=" << backlog  << std::endl;

    int fd;
    int check_ret;

    fd = socket(PF_INET,SOCK_STREAM , 0);
    assert(fd >= 0);

    int sendbuf = 4096;
    int len = sizeof( sendbuf );
    setsockopt( fd, SOL_SOCKET, SO_SNDBUF, &sendbuf, sizeof( sendbuf ) );
    getsockopt( fd, SOL_SOCKET, SO_SNDBUF, &sendbuf, ( socklen_t* )&len );
    printf( "the send buffer size after settting is %d\n", sendbuf );

    struct sockaddr_in address;
    bzero(&address,sizeof(address));

    //转换成网络地址
    address.sin_port = htons(port);
    address.sin_family = AF_INET;
    //地址转换
    inet_pton(AF_INET, ip, &address.sin_addr);
    check_ret = connect(fd, (struct sockaddr*) &address, sizeof(address));
    assert(check_ret >= 0);
    //发送数据
    const char* oob_data = "abc";
    const char* normal_data = "my boy!";

    send(fd, normal_data, strlen(normal_data), 0);
    send(fd, oob_data, strlen(oob_data), MSG_OOB);
    send(fd, normal_data, strlen(normal_data), 0);


    close(fd);
}

udp编程的例子server


#include <iostream>

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>

//using namespace std;

#define BUFFER_SIZE 1024


void tsocket(int argc, const char * argv[]);

int main(int argc, const char * argv[]) {
    tsocket(argc,argv);
    return 0;
}
void tsocket(int argc, const char * argv[]){
    if(argc < 3){
        exit(-1);
    }

    const char* ip = argv[1];
    int port = atoi(argv[2]);
    int backlog = atoi(argv[3]);

    std::cout << "ip=" << ip << " port="<<port << " backlog=" << backlog  << std::endl;

    int fd;
    int check_ret;

    fd = socket(PF_INET,SOCK_DGRAM , 0);
    assert(fd >= 0);

    struct sockaddr_in address;
    bzero(&address,sizeof(address));

    //转换成网络地址
    address.sin_port = htons(port);
    address.sin_family = AF_INET;
    //地址转换
    inet_pton(AF_INET, ip, &address.sin_addr);

    //绑定ip和端口
    check_ret = bind(fd,(struct sockaddr*)&address,sizeof(address));
    assert(check_ret >= 0);



    while(1){

        char buffer[BUFFER_SIZE];
        struct sockaddr_in addressClient;
        socklen_t clientLen = sizeof(addressClient);
        memset(buffer, '\0', BUFFER_SIZE);
        //获取信息
        if(recvfrom(fd, buffer, BUFFER_SIZE-1,0,(struct sockaddr*)&addressClient, &clientLen) == -1) 
        { 
           perror("Receive Data Failed:"); 
           exit(1); 
        } 
        printf("buffer=%s\n", buffer);
    }
    close(fd);
}

udp编程的例子client

//
//  main.cpp
//  linux_socket_api_client
//
//  Created by bikang on 16/11/2.
//  Copyright (c) 2016年 bikang. All rights reserved.
//
#include <iostream>

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>


void tserver(int argc, const char * argv[]);

int main(int argc, const char * argv[]) {
    tserver(argc,argv);
    return 0;
}
void tserver(int argc, const char * argv[]){
    std::cout << "t server" << std::endl;
    if(argc < 3){
        exit(-1);
    }

    const char* ip = argv[1];
    int port = atoi(argv[2]);
    int backlog = atoi(argv[3]);

    std::cout << "ip=" << ip << " port="<<port << " backlog=" << backlog  << std::endl;

    int fd;
    int check_ret;

    fd = socket(PF_INET,SOCK_DGRAM , 0);
    assert(fd >= 0);

    struct sockaddr_in address;
    bzero(&address,sizeof(address));

    //转换成网络地址
    address.sin_port = htons(port);
    address.sin_family = AF_INET;
    //地址转换
    inet_pton(AF_INET, ip, &address.sin_addr);
    //发送数据
    const char* normal_data = "my boy!";
    if(sendto(fd, normal_data, strlen(normal_data),0,(struct sockaddr*)&address,sizeof(address)) < 0) 
    { 
      perror("Send File Name Failed:"); 
      exit(1); 
    }
    close(fd);
}

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

linux socket编程以及简单的tcp,udp的例子 的相关文章

  • Linux上jar包运行,但是接口测试Connect超时

    工作过程中遇到的 xff0c 这个异常就是连接超时 引起连接超时的问题有很多 xff0c 因为是feign调用超时 xff0c 我第一时间没怀疑是不是我的程序无法访问 xff0c 我一直怀疑是feigin那部分出错了 xff0c 什么跨服务
  • 网络调试助手(pc端)+ESP8266指令

    一 所需软件 链接 xff1a https pan baidu com s 1ycyOSZJOsiIocY3umrG7 g 提取码 xff1a 38f2 链接 xff1a https pan baidu com s 1EUuXUKcvf A
  • AD、PADS、allegro 哪个好用?

    AD PADS allegro 哪个好用 xff1f 用哪个都没问题 xff0c 都能完成任务 xff0c 主要看公司的选择了 AD是元老级的软件了 xff0c 也是PCB设计最先出的软件 xff0c 使用最为广范 在很多操作上都非常的人性
  • 基于python+pyqt5的串口助手

    基于python 43 pyqt5的串口助手 环境 xff1a pycharm python3 8 xff0c pyqt5 xff0c pyserial xff08 需要该节的工程文件 请私信 xff0c 或加VX xff1a Crazzy
  • STM32F4四轴飞行器总结

    xff08 菜鸡一枚 xff0c 记录一些学习的体会 xff0c 并记录了学习时提出的问题 xff0c 便于自己再次查阅 xff0c 若有错误之处 xff0c 希望大佬们指正 xff0c 谢谢 xff09 四旋翼简介 xff1a 嵌入式芯片
  • 详解RTK,RTD,SBAS,WAAS,PPP,PPK,广域差分等技术之间的关系与区别

    RTK与RTD的区别 xff0c 一个是载波相位差分 一个是码差分 xff0c 并且RTK的定位精度要高一些 RTK与PPK的区别 xff0c 一个是实时提供数据信息 xff0c 一个是事后处理 WAAS是SBAS系统一个具体的实例 xff
  • c实现set集合

    集合有点编程语言会带有 xff0c 有的没有 但是我想redis的集合set你一定听说过或者用过 下面咱们用链表来实现set 相信有了前面的基础我们可以很容易的实现set集合 需要引入我的链表的list c和list h 头文件 span
  • 实时单目物体SLAM Real-time Monocular Object SLAM

    2015 摘要 xff1a 我们提出了一个基于对象的实时SLAM系统 xff0c 该系统利用了迄今为止最大的对象数据库 我们的方法包括两个主要部分 xff1a 1 xff09 利用对象刚性约束改进地图并找到其真实比例的单目SLAM算法 xf
  • linux下多线程服务器编程

    前言 xff1a 整个程序的架构就是一开始创建一个线程 xff0c 在这个线程里面做下面几个操作 xff1a 1 调用socket xff0c 创建监听客户端的socket 2 设置socket属性 xff0c 端口可以重用 3 调用bin
  • MavLink简单使用

    参考连接 xff1a https mavlink io zh 整体说明 本文不探究mavlink协议的具体内容 xff0c 只说明如何简单使用 环境 xff1a win10 c c 43 43 MAVLink仓库clone 我们其实clon
  • gazebo支持的载具类型

    类型make指令四旋翼make px4 sitl gazebo具有光流的四旋翼make px4 sitl gazebo iris opt flow3DR Solo xff08 四旋翼 xff09 make px4 sitl gazebo s
  • YoLov3目标检测代码C++版本运行

    论文地址 xff1a YOLO YOLOv2 YOLO9000 YOLOv3 YOLOv4 YOLO系列权重 配置文件下载地址 xff1a https github com AlexeyAB darknet 代码解读 xff1a Deep
  • C++ ::

    表示作用域 xff0c 和所属关系 是运算符中等级最高的 xff0c 它分为三种 1 global scope 全局作用域符 xff09 xff0c 用法 xff08 name 2 class scope 类作用域符 xff09 xff0c
  • 下载Gazebo模型

    下载Gazebo模型 这时运行下面Gazebo命令 xff0c OK xff0c 错误没有了 xff0c 但怎么是一抹黑啊 xff01 roscore amp rosrun gazebo ros gazebo 首次运行Gazebo xff0
  • Linux 项目实战记录

    1 阻塞 非阻塞 同步 异步 网络IO 典型的一次IO的两个阶段是什么 xff1f 数据就绪和数据读写 数据就绪 xff1a 根据IO操作的就绪状态 阻塞 xff1a 1 调用IO方法的线程进入阻塞状态 xff0c xff08 函数进入wa
  • Mission Planner日志分析

    将找到的不同平台的Mission planner日志分析资源汇总起来以便以后查看 xff1a Pixhawk无人机教程 8 1 在Mission Planner中下载与分析日志 APM 自动拍摄后期POS数据 APM和PIX飞控日志分析入门
  • 关于iai_kinect2中标定数据的个人理解

    iai kinect2 kinect2 bridge data 196605135147 iai kinect2 kinect2 bridge data 299150235147
  • mac地址的作用

    最近读一本关于linux编程的书籍 xff0c 看到一部分很迷茫 xff0c 忽然不知道mac地址的作用 xff0c 既然已经有了ip地址了要mac地址何用呢 xff1f MAC地址是数据链路层的地址 xff0c 如果mac地址不可直达 直
  • putty远程连接服务器,显示超时,网络么有问题

    今天用putty连接阿里云服务器时 xff0c 用ip连接一直显示超时 换了端口号也没用 xff0c 最后 xff0c 重启了一下服务就好了 xff0c 记录一下以免以后碰到
  • CUDA11.x VS2017编译报错MSB3721

    问题原因 xff1a 11 XCUDA版本太高 xff0c 用10版本的就行了 博主电脑是联想拯救者3070显卡 xff0c 于是就按照网上的教程下载了适合我NVIDIA版本11 4的CUDA 按照网上配置弄完之后 xff0c VS2017

随机推荐

  • Ubuntu 使用VNCserver远程连接灰屏问题的解决方案

    问题 xff1a Ubuntu需要使用VNCserver服务提供远程桌面 xff0c 使用TightVNC Viewer远程连接主机 xff0c 发现只能出现三个正常显示的桌面 xff0c 继续开更多的桌面 xff0c 就会发现新开的窗口都
  • opencv-python(六):颜色空间及转换

    0 颜色模式 RGB 模式 百万种颜色 CMYK 模式 四种印刷色 索引模式 256 种颜色 xff09 灰度模式 256 级灰度 xff09 位图模式 两种颜色 xff09 0 1 灰度模式 也就是灰度图 黑白照片 xff0c 每个像素只
  • python爬虫之多线程、多进程爬虫

    一 原因 多线程对爬虫的效率提高是非凡的 xff0c 当我们使用python的多线程有几点是需要我们知道的 xff1a 1 Python的多线程并不如java的多线程 xff0c 其差异在于当python解释器开始执行任务时 xff0c 受
  • Ubuntu16 ROS ORB-SLAM3 intelD435与单目USB_CAM 跑自己的摄像头运行成功记录

    我也是根据其他人的教程来的 xff0c 其实我应该搞错了顺序 xff0c 按道理是先安装ROS xff0c 然后是D435驱动 xff0c 再下载ORBSLAM3 再编译SLAM3的非ROS xff0c 再编译SLAM3的ROS 但是这个顺
  • stm32 驱动ADXL345传感器例程(IIC驱动,可自行改SPI方式)

    stm32 驱动ADXL345传感器例程 xff08 IIC驱动 xff0c 可自行改SPI方式 xff09 前言一 介绍ADXL345传感器二 STM32驱动使用步骤1 配置IIC通信协议2 寄存器初始化配置3 读入数据串口打印 三 成果
  • (6)gazebo打开后黑屏,提示preparing your world

    问题描述 xff1a 运行roscore xff0c 再运行rosrun gazebo ros gazebo xff0c 可以打开gazebo xff0c 但是发现界面会发现一直处于黑屏这种状态 xff0c 提示preparing your
  • 树莓派3B+(64位)安装Ubuntu mate 16.04.2以及彩虹屏解决方案及相关文件

    1 烧录工具 链接 xff1a https pan baidu com s 1c5Vf9zzpCBySEyBNP 7nw pwd 61 1234 提取码 xff1a 1234 2 树莓派3B 43 xff08 64位 xff09 Ubunt
  • [shopee内推] 前端、后端、测试目前公司拉美市场急缺人才

    待遇超级好 薪资超级高 工作地点 xff1a 深圳 可直接发送简历到 xff1a ziwen jiang 64 qq com 可加微信 xff1a JZWen tiger 职位描述 岗位职责 xff1a 1 参与面向东南亚等地区的线上 am
  • mac xcode出现xxx.h没有出现的问题

    mac xcode出现xxx h没有出现的问题 xff0c 在命令行使用g 43 43 lxx编译代码却完全没有问题 xff0c 得出的结论是xcode的配置不到位 找了半个小时没找到莫名的烦躁 xff0c 使用xarman studio
  • 深入理解Linux网络:第二章-内核是怎么接收数据包的?

    关于中断 内核和网络设备驱动都是通过中断的方式来处理的 当然中断分为两种 xff0c 硬中断和软中断 当设备有数据进来了 xff0c 设备首先会触发硬中断 xff0c 因为处理数据需要耗费很长的时间所以CPU肯定是要把耗时的事情交给别人去干
  • 深入理解Linux网络:第三章-内核是如何与用户进程协作的

    本章主要讲用户进程接收并处理数据 xff0c 主要是介绍 xff0c 同步阻塞和多路IO复用方案 同步阻塞 一个进程维护一个链接 xff0c 同时为了等待数据到来需要阻塞进程 xff0c 还要切换进程上下文 创建Socket进入内核态 xf
  • 关于ssm框架,自己学到了的认识的东西

    1 先说说Maven吧 第一次用这东西 xff0c 很恐怖 其实简单说它的作用就是管理你的jar包 我们可以通过配置pom xml文件去下载相应的jar包 然后就再也不需要担心jar包版本不匹配的问题 注意1 xff1a 尽量选使用量高的j
  • 大白话 java动态代理——秒懂系列

    代理模式分为动态代理和静态代理 xff0c 重点是动态代理 什么叫做代理 xff1f 首先要有一个接口 xff0c 定义了我们的服务 xff08 标准 xff09 然后是一个实现类 xff08 继承上面那个接口 xff09 还有有一个代理类
  • 杭州顶象技术面经+解析

    额 xff0c 第一份面经 xff0c 电面 xff0c 好难受 xff0c 好像凉了 xff0c 一篇凉经 1 跨域解决 这是一道常见面试题 所以我还是需要多看看nginx原理 xff0c 因为我还是很有可能就答ngxin的 1 json
  • volatile关键字 + happens-before原则

    volatile 可见性 有序性 记住了 xff0c 人家不保证原子性的 先说说volatile关键字 被volatile关键字修饰的变量 xff0c 再多线程中 xff0c 一个线程修改他会立即被其他线程看到 xff0c 可能这样你不太理
  • linux常问面试题

    写下来慢慢看 linux 1 查看当前路径 pwd 2 怎么清屏 xff1f 清屏 xff1a clear 3 怎么退出当前命令 xff1f 退出当前命令 xff1a ctrl 43 c 彻底退出 4 怎么执行睡眠 xff1f 执行睡眠 x
  • JUC_大厂面试必问

    J U C java util concurrent 包下的类 大家先来看一张图几片吧 首先juc分为 tools xff1a lock collections 线程池 xff1a atomic 感兴趣的同学可以关注我的公众号 xff0c
  • 字符串最小变换次数——动态规划

    感觉自己算法太菜了 woc xff0c 想找一个算法大佬 xff0c 给他做舔狗 package offer 动态规划求解 将字符串A变换为字符串B 所用的最少字符操作次数 public class Day0418 demo01 publi
  • 《动手学深度学习》环境配置篇

    自己按照书上Windows的安装中遇到的问题 D d2l zh gt conda env create f environment yml Warning you have pip installed dependencies in you
  • linux socket编程以及简单的tcp,udp的例子

    linux socket编程以及简单的tcp udp的例子 通过socket编程大致对网路编程的脉络有个大致的了解 xff0c 如果有不太懂的地方 xff0c 咱们可以到网络上查找手册 socket的基本操作 创建socket int so