zoukankan      html  css  js  c++  java
  • socket()函数介绍

    socket()函数介绍

    函数原型

    socket()函数的原型如下,这个函数建立一个协议族为domain、协议类型为type、协议编号为protocol的套接字文件描述符。如果函数调用成功,会返回一个标识这个套接字的文件描述符,失败的时候返回-1。

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

    domain

    函数socket()的参数domain用于设置网络通信的域,函数socket()根据这个参数选择通信协议的族。通信协议族在文件sys/socket.h中定义。

    表1 domain的值及含义

    名称含义名称含义
    PF_UNIX,PF_LOCAL 本地通信 PF_X25 ITU-T X25 / ISO-8208协议
    AF_INET,PF_INET IPv4 Internet协议 PF_AX25 Amateur radio AX.25
    PF_INET6 IPv6 Internet协议 PF_ATMPVC 原始ATM PVC访问
    PF_IPX IPX-Novell协议 PF_APPLETALK Appletalk
    PF_NETLINK 内核用户界面设备 PF_PACKET 底层包访问

    type

    函数socket()的参数type用于设置套接字通信的类型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(数据包套接字)等。

    表2 type的值及含义

    名称含义
    SOCK_STREAM Tcp连接,提供序列化的、可靠的、双向连接的字节流。支持带外数据传输
    SOCK_DGRAM 支持UDP连接(无连接状态的消息)
    SOCK_SEQPACKET 序列化包,提供一个序列化的、可靠的、双向的基本连接的数据传输通道,数据长度定常。每次调用读系统调用时数据需要将全部数据读出
    SOCK_RAW RAW类型,提供原始网络协议访问
    SOCK_RDM 提供可靠的数据报文,不过可能数据会有乱序
    SOCK_PACKET 这是一个专用类型,不能呢过在通用程序中使用

    并不是所有的协议族都实现了这些协议类型,例如,AF_INET协议族就没有实现SOCK_SEQPACKET协议类型。

    protocol

    函数socket()的第3个参数protocol用于制定某个协议的特定类型,即type类型中的某个类型。通常某协议中只有一种特定类型,这样protocol参数仅能设置为0;但是有些协议有多种特定的类型,就需要设置这个参数来选择特定的类型。

    • 类型为SOCK_STREAM的套接字表示一个双向的字节流,与管道类似。流式的套接字在进行数据收发之前必须已经连接,连接使用connect()函数进行。一旦连接,可以使用read()或者write()函数进行数据的传输。流式通信方式保证数据不会丢失或者重复接收,当数据在一段时间内任然没有接受完毕,可以将这个连接人为已经死掉。
    • SOCK_DGRAM和SOCK_RAW 这个两种套接字可以使用函数sendto()来发送数据,使用recvfrom()函数接受数据,recvfrom()接受来自制定IP地址的发送方的数据。
    • SOCK_PACKET是一种专用的数据包,它直接从设备驱动接受数据。

    errno

    函数socket()并不总是执行成功,有可能会出现错误,错误的产生有多种原因,可以通过errno获得:

    表3 errno的值及含义

    含义
    EACCES 没有权限建立制定的domain的type的socket
    EAFNOSUPPORT 不支持所给的地址类型
    EINVAL 不支持此协议或者协议不可用
    EMFILE 进程文件表溢出
    ENFILE 已经达到系统允许打开的文件数量,打开文件过多
    ENOBUFS/ENOMEM 内存不足。socket只有到资源足够或者有进程释放内存
    EPROTONOSUPPORT 制定的协议type在domain中不存在
    其他  

    示例

    建立一个流式套接字:

    int sock = socket(AF_INET, SOCK_STREAM, 0);
    • 1
    • 1
     
     
  • 相关阅读:
    KVM + LinuxBridge 的网络虚拟化解决方案实践
    netfilter/iptables 防火墙
    Linux 的路由功能
    使用 tcpdump 抓包分析 TCP 三次握手、四次挥手与 TCP 状态转移
    the quieter you become,the more you could see.
    ghost和WINHEX磁盘备份功能的区别
    快速格式化和非快速格式化
    软件是如何控制硬件的?
    如何思考一个问题?
    遇到劣质空气开关了
  • 原文地址:https://www.cnblogs.com/tdalcn/p/7137293.html
Copyright © 2011-2022 走看看