TCP套接字之socket函数

时间:2019-02-19
本文章向大家介绍TCP套接字之socket函数,主要包括TCP套接字之socket函数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在执行网络I/O时, 要做的第一件事就是调用socket函数.

函数原型

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

成功 : 返回非负描述符.

失败 : 返回-1, 设置errno的值.

函数错误时返回-1, 但是也会设置相应的errno的值 :

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

函数参数

  • 其中参数family指明的是协议族, 通常也被叫做协议域. 参数可以是(我们只用AF_INET) :

    描述
    AF_INET, PF_INET IPv4 Internet域
    AF_INET6, PF_INET6 IPv6 Internet域
    AF_UNIX, PF_UNIX UNIX域
    AF_UPSPEC 未指定
  • type指明套接字类型, 参数有(TCP中默认设置为SOCK_STREAM) :

    类型 描述
    SOCK_STREAM TCP连接, 提供序列化的、可靠的、双向连接的字节流. 支持带外数据传输
    SOCK_DGRAM 支持UDP连接(无连接状态的消息)
    SOCK_SEQPACKET 有序分组套接字. 序列化包,提供一个序列化的、可靠的、双向的基本连接的数据传输通道,数据长度定常。每次调用读系统调用时数据需要将全部数据读出
    SOCK_RAW 原始网络协议套接字
  • protocol一般默认为0就行, 参数有 :

    协议 描述
    IPPRPTO_IP IPv4 Internet协议
    IPPROTO_TCP 传输控制协议
    IPPROTO_UDP 用户数据报协议

函数调用成功返回的是一个文件描述符, 毕竟在linux中万物皆文件. 既然返回的是文件描述符, 那么当我们在调用fork函数时一定要注意, 子进程会复制父进程的所有文件描述符哦. 这个问题我们在之后来探讨.

函数的调用

socket函数是很容易上手的.

#include <sys/socket.h>
int sockfd;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0) EXIT("socket");

总结

  • family一般为AF_INET.
  • type一般为SOCK_STREAM.
  • protocol一般置0
  • 返回的是一个文件描述符