zoukankan      html  css  js  c++  java
  • socket 函数

    socket 函数

    system Call socket 函数原型:

    int  socket(int addressfamily, int type, int protocol);
    

    参数adressfamily 举例

    adress family种类 功能描述
    AF_INET IPV4用socket
    AF_INET6 IPV6用socket
    AF_UNIX 本地进程间通信用socket,也叫AF_LOCAL
    AF_PACKET driver lebel socket的接口

    参数type 举例

    type 种类 功能描述
    SOCK_STREAM 保证有序,都能到达。双向的byte stream
    SOCK_DGRAM 不保证连接,顺序,支持data的最大固定长度

    adressfamily和type的组合,来决定是使用TCP还是UDP协议

    • AF_INET+SOCK_STREAM : IPv4+TCP
    • AF_INET6+SOCK_STREAM : IPv6+TCP
    • AF_INET+SOCK_DGRAM : IPv4+UDP
    • AF_INET6+SOCK_DGRAM : IPv6+UDP

    SOCK_STREAM和SOCK_DGRAM的比较:

    socket种类 数据是否一定送达 数据到达顺序 一次送信的数据量的大小
    SOCK_STREAM 一定 按发送顺序 没有大小限制
    SOCK_DGRAM 不一定 有可能不是发送顺序 有大小限制

    参数protocol 在ubuntu下的查看方法:

    sudo cat /etc/protocols
    

    socket的本质是linux系统里的文件描述符(file descriptor),就是一个整数值。

    linux里标准的文件描述符:

    整数值 名字 说明
    0 stdin 标准输入
    1 stdout 标准输出
    2 stderr 标准错误输出

    所以判断socket建立成功与否,就是判断system call socket的返回值是啥

    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0){
      cout << "socket 建立失败" << endl;
      return -1;
    }
    

    注意:不可以用if(sock <= 0)来判断,=0的时候,也有可能是socket建立成功。下面代码socket建立成功了,但是返回值是0.因为提前把stdin关闭了。

    int main(){
      int sock;
      cout << "fileno(stdin): " << fileno(stdin) << endl;
      close(0);
    
      sock = socket(AF_INET, SOCK_DGRAM, 0);
      cout << sock << endl;
    
    }
    

    当使用一个函数时,但不知道是在哪个.h文件的时候,输入:

    man 函数名字
    

    会得到类似下面的结果,比如

    man socket
    

    再比如

    man malloc
    

    从图片中可以看出:

    • 【2】代表system call
    • 【3】代表系统库函数

    c/c++ 学习互助QQ群:877684253

    本人微信:xiaoshitou5854

  • 相关阅读:
    VSCode集成TypeScript编译
    http模拟登陆及发请求
    1​1​.​0​5​9​2​M​晶​振​与12M晶振
    单片机定时器2使用
    Altium Designer 小记
    sql-mysql
    java英文缩写
    Altium Design
    Tomcat使用
    jar/war/ear文件的区别
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/9747474.html
Copyright © 2011-2022 走看看