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

  • 相关阅读:
    内存管理——显式类型转换
    内存管理——隐式类型转换
    数据类型——构造类型——枚举
    构造类型——联合类型
    结构体学习笔记9——结构体大小计算规则
    结构体学习笔记8——内存对齐
    结构体学习笔记7——结构体数组
    结构体学习笔记6——结构体嵌套
    结构体学习笔记5——指针成员与函数成员
    一.js高级(9)深拷贝-浅拷贝的其他方法
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/9747474.html
Copyright © 2011-2022 走看看