返回顶部
首页 > 资讯 > 操作系统 >学习Linux网络编程基本函数
  • 847
分享到

学习Linux网络编程基本函数

Linux网络编程基本函数学习 2022-06-04 23:06:06 847人浏览 泡泡鱼
摘要

目录1,创建套接字Socket函数原型:参数列表:type的值:protocol得值:2,绑定套接字bind函数原型:参数列表:3,创建监听;listen函数原型:参数列表:4,等待连接accept函数原型:5, 收发消

目录
  • 1,创建套接字Socket
    • 函数原型:
    • 参数列表:
    • type的值:
    • protocol得值:
  • 2,绑定套接字bind
    • 函数原型:
    • 参数列表:
  • 3,创建监听;listen
    • 函数原型:
    • 参数列表:
  • 4,等待连接accept
    • 函数原型:
  • 5, 收发消息send和recv
    • 函数原型:
    • 该函数的参数:
    • send的流程:
    • recv的流程:
  • 5,关闭套接字描述符close
    • 函数:
  • 6,基于tcp协议的C/S服务器模型
    • 7,实现代码
      • 服务端:
      • 客户端:

    1,创建套接字socket

    函数原型:

    
    #include<sys/types.h>
    #include<sys/socket.h>
    int socket(int domain, int type, int protocol);

    参数列表:

    domain参数有以下这些值

    AF_INET:IPv4协议
    AF_INET6:IPv6协议
    AF_LOCAL:Unix域协议
    AF_ROUTE:路由套接口
    AF_KEY:密钥套接口

    type的值:

    SOCKET_STREAM:双向可靠数据流,对应TCPSOCKET_DGRAM:双向不可靠数据报,对应UDPSOCKET_RAW:提供传输层以下的协议,可以访问内部网络接口,例如接收和发送ICMP报文

    protocol得值:

    type为SOCKET_RAW时需要设置此值说明协议类型,其他类型设置为0即可

    函数的作用是创建一个指定格式的套接字并返回其描述符,成功返回描述符,失败返回-1;

    2,绑定套接字bind

    函数原型:

    
    #include<sys/types.h>
    #include<sys/socket.h>
    int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);

    参数列表:

    sockfd为之前创建的套接字描述符

    my_addr是一个通用套接字结构体指针,在做tcp协议编程时通常使用sockaddr_in结构体

    该结构体内容如下;

    
    struct socketaddr_in
    {
       unsigned short int sin_family;//对应地址族IP v4填AF_INTE
       uint16_t sin_port;//对应端口号
       struct in_addr sin_addr;//对应ip地址
       unsigned char sin_zero[8];
    };
    struct in_addr
    {
       uint32_t s_addr;
    };

    addrlen为该上述结构体的大小,可以用sizeof求得;

    在使用bind函数前需要先创建一个sockaddr_in类型的结构体,将服务器的信息保存到结构体中,

    然后将创建的套接字与之绑定;成功返回0,失败返回-1;

    在设置端口号和IP时先将结构体清空,如果是主函数传参,那么对应的端口号和ip都是字符串格式,

    需要用函数转换,转换格式如下:

    
    char port[]="8888"
    char ip[]="192.168.1.1"
    struct sockaddr_in seraddr'
    seraddr.sin_port=htos(atoi(port))
    seraddr.sin_addr.s_addr=inet_addr(ip);

    3,创建监听;listen

    函数原型:

    
    int listen(int fd, int backlog);

    参数列表:

    fd为要监听的套接字描述符;backlog为监听队列的大小;

    (1) 执行listen 之后套接字进入被动模式。

    (2) 队列满了以后,将拒绝新的连接请求。客户端将出现连接D 错误WSAECONNREFUSED。

    (3) 在正在listen的套接字上执行listen不起作用。

    4,等待连接accept

    函数原型:

    
    #include <sys/socket.h>
     int accept(int s, struct sockaddr * addr, int * addrlen);

    对比bind函数可以发现两者的参数几乎一样,但是accept中的addr不被const修饰,

    也就是说addr是用来保存连接的客户端的地址信息的,同杨addlen时返回的addr的大小;

    所以accept函数的作用就是返回已连接的客户端的文件描述符,

    并将客户端的地址信息保存在一个新的sockaddr_in结构体中;链接失败返回-1;

    5, 收发消息send和recv

    函数原型:

    
      int send( SOCKET s, const char FAR *buf, int len, int flags );
      int recv( SOCKET s, char FAR *buf, int len, int flags); 

    该函数的参数:

    • 第一个参数指定发送/接受端套接字描述符;
    • 第二个参数指明一个存放应用程序要发送数据的缓冲区;
    • 第三个参数指明实际要发送/接收的数据的字节数;
    • 第四个参数一般置0。

    send的流程:

    这里只描述同步Socket的send函数的执行流程。

    当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的长度,

    •  如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;
    • 如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,
    • 如果是就等待协议把数据发送完,
    • 如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len,
    • 如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完,
    • 如果len小于剩余空间大小send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里);
    • 如果send函数copy数据成功,就返回实际copy的字节数,
    • 如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;
    • 如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。

    要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。

    • 如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。
    • (每一个除send外的Socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,
    • 如果在等待时出现网络错误,那么该Socket函数就返回SOCKET_ERROR)。

    recv的流程:

    这里只描述同步Socket的recv函数的执行流程。

    当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,

    • 如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,
    • 如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,
    • 如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到协议把数据接收完毕。
    • 当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中

    (注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。

    recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数。

    • 如果recv在copy时出错,那么它返回SOCKET_ERROR;
    • 如果recv函数在等待协议接收数据时网络中断了,那么它返回0。
    • tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.
    • 不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据.
    • 在阻塞模式下, send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.

    但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回,同时向网络中发送数据;

    否则,send向网络发送缓存中不能容纳的那部分数据,并等待对端确认后再返回(接收端只要将数据收到接收缓存中,

    就会确认,并不一定要等待应用程序调用recv);

    • 在非阻塞模式下,send函数的过程仅仅是将数据拷贝到协议栈的缓存区而已,
    • 如果缓存区可用空间不够,则尽能力的拷贝,
    • 返回成功拷贝的大小;如缓存区可用空间为0,则返回-1,同时设置errno为EAGAIN.

    5,关闭套接字描述符close

    函数:

    close(sockfd);

    和文件操作一样,套接字也是一个文件,使用完之后要关闭;

    6,基于tcp协议的C/S服务器模型

    Linux学习笔记-网络编程(二)

    图解tcp模型

    7,实现代码

    服务端:

    
    #include <stdio.h>
    #include <stdlib.h>
    #include <strings.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netinet/ip.h>
    #include <arpa/inet.h>
    #include <unistd.h>
     
    typedef struct sockaddr_in SIN;
    typedef struct sockaddr SA;
     
    int main(int arGC,char *argv[])
    {
        SIN seraddr;
        SIN cliaddr;
        int len=sizeof(SIN);
        //创建监听套接字
        int lisfd=socket(AF_INET,SOCK_STREAM,0);
        if(lisfd<0)
        {
            perror("socket");
            exit(0);
        }
        printf("创建套接字%d成功\n",lisfd);
        bzero(&seraddr,sizeof(seraddr));
        seraddr.sin_family=AF_INET;
        seraddr.sin_port=htons(8888);
        seraddr.sin_addr.s_addr=inet_addr("192.168.1.6");
        //绑定套接子
        int ret=bind(lisfd,(SA*)(&seraddr),len);
        if(ret<0)
        {
            perror("bind");
            exit(0);
        }
        printf("绑定成功\n");
        //开始监听
        ret=listen(lisfd,1024);
        if(ret<0)
        {
            perror("listen");
            exit(0);
        }
        printf("监听成功\n");
        //等待连接,将连接的套接字信息保存
        int clifd=accept(lisfd,(SA*)(&cliaddr),(socklen_t *)(&len));
        if(clifd<0)
        {
            perror("accept");
            exit(0);
        }
        printf("客户端%d连接成功\n",clifd);
        //读写
        char readbuf[1024]={0};
        char sendbuf[1024]={0};
        while(1)
        {
            recv(clifd,readbuf,sizeof(readbuf),0);
            printf("recv:%s\n",readbuf);
            fgets(sendbuf,sizeof(sendbuf),stdin);
            send(clifd,sendbuf,sizeof(sendbuf),0);
        }
        //关闭套接字
        close(clifd);
        close(lisfd);
        return 0;
    }

    客户端:

    
    #include <stdio.h>
    #include <stdlib.h>
    #include <strings.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netinet/ip.h>
    #include <arpa/inet.h>
    #include <unistd.h>
     
    typedef struct sockaddr_in SIN;
    typedef struct sockaddr SA;
     
    int main(int argc,char *argv[])
    {
        SIN seraddr;
        //创建监听套接字
        int serfd=socket(AF_INET,SOCK_STREAM,0);
        if(serfd<0)
        {
            perror("socket");
            exit(0);
        }
        printf("创建套接字%d成功\n",serfd);
        bzero(&seraddr,sizeof(seraddr));
        seraddr.sin_family=AF_INET;
        seraddr.sin_port=htons(8888);
        seraddr.sin_addr.s_addr=inet_addr("192.168.1.6");
        //请求连接
        int ret=connect(serfd,(SA*)(&seraddr),sizeof(SIN));
        if(ret==-1)
        {
            perror("connect");
            exit(0);
        }
        printf("连接成功\n");
        //读写
        char senbuf[1024]={0};
        char readbuf[1024]={0};
        while(1)
        {
            fgets(senbuf,sizeof(senbuf),stdin);
            send(serfd,senbuf,sizeof(senbuf),0);
            recv(serfd,readbuf,sizeof(readbuf),0);
            printf("recv:%s\n",readbuf);
        }
        //关闭套接字
        close(serfd);
        return 0;
    }

    以上就是学习linux网络编程基本函数的详细内容,更多关于Linux网络编程基本函数的资料请关注我们其它相关文章!

    --结束END--

    本文标题: 学习Linux网络编程基本函数

    本文链接: https://lsjlt.com/news/21383.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • 学习Linux网络编程基本函数
      目录1,创建套接字socket函数原型:参数列表:type的值:protocol得值:2,绑定套接字bind函数原型:参数列表:3,创建监听;listen函数原型:参数列表:4,等待连接accept函数原型:5, 收发消...
      99+
      2022-06-04
      Linux网络编程 基本函数学习
    • 简析Linux网络编程函数
      目录1,创建套接字socket2,绑定套接字bind3,创建监听;listen4,等待连接accept5, 收发消息send和recv6,关闭套接字描述符close7,基于tcp协议的C/S服务器模型8,实现代码网络编程...
      99+
      2022-06-04
      Linux网络编程函数
    • NodeJS学习笔记之网络编程
      Node提供丰富的网络编程模块 Node模块 协议 net TCP dgram ...
      99+
      2022-06-04
      学习笔记 网络编程 NodeJS
    • python学习笔记(十 三)、网络编程
      最近心情有点儿浮躁,难以静下心来     Python提供了强大的网络编程支持,很多库实现了常见的网络协议以及基于这些协议的抽象层,让你能够专注于程序的逻辑,而无需关心通过线路来传输比特的问题。 1 几个网络模块   1.1 模块sock...
      99+
      2023-01-31
      学习笔记 网络编程 python
    • python 网络编程学习 非阻塞soc
      主要学习服务器的异步使用 SocketServer简化了网络服务器的编写。它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。这4个类是同步进行处理的,另外通过For...
      99+
      2023-01-31
      网络编程 python soc
    • Python深度学习神经网络基本原理
      目录神经网络梯度下降法神经网络 梯度下降法 在详细了解梯度下降的算法之前,我们先看看相关的一些概念。     1. 步长(Learning rate):步长决定了在梯度下降迭...
      99+
      2024-04-02
    • 如何使用linux网络编程用到的网络函数
      本篇内容主要讲解“如何使用linux网络编程用到的网络函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用linux网络编程用到的网络函数”吧!一.概念介绍网络程序分为服务端程序和客户端程...
      99+
      2023-06-09
    • java基础学习笔记:一文带你搞懂网络编程
      1. 网络编程学习...
      99+
      2023-06-02
    • PHP学习笔记:网络编程与Socket通信
      在当今互联网时代,网络编程是一项非常重要的技能。它允许我们在不同的计算机之间进行通信和数据交换。而PHP作为一种强大的服务器端脚本语言,提供了丰富的网络编程功能,其中包括Socket通信。Socket通信是一种基于TCP/IP协议的网络编程...
      99+
      2023-10-21
      PHP网络编程 学习笔记 Socket通信
    • Java 网络编程基础
      文章目录 前言什么是网络编程网络编程基础知识网络通讯流程长连接和短连接Socket Java 网络编程总结 前言 一个网络请求、服务之间的调用都需要进行网络通讯,在日常开发时我们可能并不会关心我们的服务端是怎么接收到请求的、...
      99+
      2023-08-16
      java 网络 开发语言
    • ​​​​​​​Python 入门学习之函数式编程
      目录前言把函数作为对象把对象作为函数数据结构内的函数把函数作为参数和返回值嵌套函数单表达式函数(Lambda 表达式)Map、Filter 和 ReduceMapFilterRedu...
      99+
      2024-04-02
    • 学习网络编程No.5【TCP套接字通信】
      引言: 北京时间:2023/8/25/15:52,昨天刚把耗时3天左右的文章更新,充分说明我们这几天并不是在摆烂中度过,而是在为了更文不懈奋斗,历时这么多天主要是因为该部分知识比较陌生,所以需要我们花...
      99+
      2023-09-05
      网络 学习 tcp/ip
    • python基础学习11----函数
      一.函数的定义 def 函数名(参数列表): 函数体 return语句 return语句不写或后边不加任何对象即为return None 二.函数的参数 无参数 def func1(): print("没有...
      99+
      2023-01-30
      函数 基础 python
    • Python基础:网络编程socket基
      socket也叫套接字,是对各种协议的封装,实现收发数据。Python里socket工作过程:(图片来自网络)socket在Python中实际上是一个模块,实现发送和接收数据的功能。因为socket是一个类,所以只导入模块需要使用socke...
      99+
      2023-01-31
      网络编程 基础 Python
    • linux网络编程用到的网络函数详解用和使用示例
      一.概念介绍网络程序分为服务端程序和客户端程序。服务端即提供服务的一方,客户端为请求服务的一方。但实际情况是有些程序的客户端、服务器端角色不是这么明显,即互为客户端和服务端。我们编写网络程序时,一般是基于T...
      99+
      2022-06-04
      示例 详解 函数
    • Linux系统编程中的网络编程基础是什么
      这篇文章主要为大家分析了Linux系统编程中的网络编程基础是什么的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Linux系统编程中的网络编程基础是什么”的知...
      99+
      2023-06-28
    • Linux中怎么设置基本网络参数
      这期内容当中小编将会给大家带来有关Linux中怎么设置基本网络参数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、引言 在Red Hat Linux 6.0系统中,自带有Netscape浏览器,让Lin...
      99+
      2023-06-13
    • linux shell脚本基础知识学习
      Shell脚本: 1、#! 指定脚本执行的shell2、# 注释 3、命令或语法结构echo "输入内容"echo 输出空行执行: 1、shell 脚本 sh example2、给shell脚本执行权...
      99+
      2022-06-04
      基础知识 脚本 linux
    • C#网络编程TCP基本概念是什么
      这篇文章主要介绍“C#网络编程TCP基本概念是什么”,在日常操作中,相信很多人在C#网络编程TCP基本概念是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#网络编程TCP基本概念是什么”的疑惑有所帮助!...
      99+
      2023-06-18
    • 学习网络编程No.8【应用层协议之HTTP】
      引言: 北京时间:2023/10/9/13:03,一晃好多天过去了,9月14号的文章终于在昨天发出去了,也是许久没有更文了,国庆放假期间由于各种原因,在王者峡谷和铲子世界遨游的不亦乐乎,有待改善!目前...
      99+
      2023-10-26
      1024程序员节 网络 http
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作