1、int socket(int protofamily, int type, int protocol)

(1)protofamily:即协议域,又称为协议族(family)。

常用的协议族有,AF_INET(IPV4)、AF_INET6(IPV6)、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。

(2)type:指定socket类型。

常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等(socket的类型有哪些?)。

(3)protocol:就是指定协议。

常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议(这个协议我将会单独开篇讨论!)。

2、int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)

(1)sockfd:即socket()返回的套接字描述符,bind()函数就是为了给这个套接字绑定一个名字

(2)addr:指要绑定给socketfd的地址;不同的协议绑定的地址不一样

- struct sockaddr_in {

sa_family_t sin_family; /* address family: AF_INET */

in_port_t sin_port; /* port in network byte order */

struct in_addr sin_addr; /* internet address */

};

/* Internet address. */struct in_addr {

uint32_t s_addr; /* address in network byte order */

};

- ipv6对应的是:

struct sockaddr_in6 {

sa_family_t sin6_family; /* AF_INET6 */

in_port_t sin6_port; /* port number */

uint32_t sin6_flowinfo; /* IPv6 flow information */

struct in6_addr sin6_addr; /* IPv6 address */

uint32_t sin6_scope_id; /* Scope ID (new in 2.4) */

};

struct in6_addr {

unsigned char s6_addr[16]; /* IPv6 address */

};

- Unix域对应的是:

#define UNIX_PATH_MAX 108

struct sockaddr_un {

sa_family_t sun_family; /* AF_UNIX */

char sun_path[UNIX_PATH_MAX]; /* pathname */

};

(3)addrlen:对应的是地址的长度。

3、int listen(int sockfd, int backlog)

(1)sockfd: 要监听的socket描述字;

(2)backlog:相应socket可以排队的最大连接个数。

socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。

4、int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)

(1)sockfd:客户端的socket描述字;

(2)addr:服务器的socket地址;

(3)addrlen:socket地址的长度;

客户端通过调用connect函数来建立与TCP服务器的连接。

5、int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)

(1)sockfd: 监听套接字,这个套接字用来监听一个端口,当有一个客户与服务器连接时关联这个端口号,在socket创建后绑定时地址参数的端口号

(2)addr: 这是一个结果参数,它用来接受一个返回值,这返回值指定客户端的地址,当然这个地址是通过某个地址结构来描述的,用户应该知道这一个什么样的地址结构。如果对客户的地址不感兴趣,那么可以把这个值设置为NULL。

(3)addrlen: 如同大家所认为的,它也是结果的参数,用来接受上述addr的结构的大小的,它指明addr结构所占有的字节个数。同样的,它也可以被设置为NULL。

如果accept成功返回,则服务器与客户已经正确建立连接了,此时服务器通过accept返回的套接字来完成与客户的通信。

注意:

accept默认会阻塞进程,直到有一个客户连接建立后返回,它返回的是一个新可用的套接字,这个套接字是连接套接字。

此时我们需要区分两种套接字,

监听套接字: 监听套接字正如accept的参数sockfd,它是监听套接字,在调用listen函数之后,是服务器开始调用socket()函数生成的,称为监听socket描述字(监听套接字)

连接套接字:一个套接字会从主动连接的套接字变身为一个监听套接字;而accept函数返回的是已连接socket描述字(一个连接套接字),它代表着一个网络已经存在的点点连接。

6、read()、write()

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

ssize_t write(int fd, const void *buf, size_t count);

#include <sys/types.h>

#include <sys/socket.h>

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

7、int close(int fd)

close一个TCP socket的缺省行为时把该socket标记为以关闭,然后立即返回到调用进程。该描述字不能再由调用进程使用,也就是说不能再作为read或write的第一个参数。

注意:close操作只是使相应socket描述字的引用计数-1,只有当引用计数为0的时候,才会触发TCP客户端向服务器发送终止连接请求。

socket函数接口相关推荐

  1. 【C/C++服务器开发】socket网络编程函数接口详解

    文章目录 一.前言 TCP 网络编程 结合三次握手连接的 TCP socket 结合四次次挥手的 TCP socket 二.socket常用函数和数据结构 1.socket()函数 2.bind() ...

  2. Socket中接口函数简介

    文章目录 1.创建socket domain type protocol errno 2.命名socket sockaddr_in bind connect() 3.监听socket 4.接收连接 5 ...

  3. C语言 socket listen()函数(socket()函数创建的socket(套接字描述符)默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求)

    摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被 ...

  4. python socket.socket()函数 套接字详解及TCP、UDP程序示例(粘包等)

    文章目录 socket的定义 套接字的工作流程 socket函数使用 socket函数用法 服务端套接字函数 客户端套接字函数 公共用途的套接字函数 面向文件的套接字方法 打电话的流程演示 服务端.p ...

  5. socket , 套接口还是套接字,傻傻分不清楚

    socket 做网络通信的朋友大都对socket这个词不会感到陌生,但是它的中文翻译是叫套接口还是套接字呢,未必大多数朋友能够分清,今天我们就来聊聊socket的中文名称. socket一词的起源 在 ...

  6. 三次握手 四次握手 与socket函数的关系

    我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠so ...

  7. 【Linux】详解socket编程接口

    socket编程接口详解 1. socket常见API 2. IPv4协议的地址信息结构:sockaddr_in结构体 2.1 sockaddr结构体 2.2 in_addr结构体 2.3 socka ...

  8. 一切皆socket!网络编程:三次握手 四次握手 与socket函数的关系

    转载地址:http://www.cnblogs.com/suntp/p/6434644.html 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与w ...

  9. 随笔 - 58, 文章 - 0, 评论 - 0, 引用 - 0 三次握手 四次握手 与socket函数的关系

    1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect()函数 3.4.a ...

最新文章

  1. linux创建启动连接数据库,DB2入门(1)--安装、启动、连接
  2. javascript中==与===的区别
  3. 从书上截取一段TCP三次握手和四次挥手
  4. 坚实原则:开放/封闭原则
  5. 原动力CMS PHP域名授权系统V3.0
  6. Linux内核深入理解中断和异常(7):中断下半部:Softirq, Tasklets and Workqueues
  7. 【转载】Redis在windows下安装和配置
  8. 卷积神经网络CNN的由来,为什么要用卷积?
  9. DMX512标准发送及代码整理
  10. MDM主数据清洗和编码集成说明
  11. dalek-cryptography 与adjoint-io bulletpoofs性能对比
  12. js初级动态随机抽人事件运用 计时器和超时期应用 解决用on事件onclick多次点击不能停止的问题
  13. Android OTG U盘相关
  14. JAVA学习日志 关于调用方法、生成对象的例子。还是用数字卦程序修改
  15. XML格式化在线工具
  16. 代码注释如此沙雕,会玩还是你们程序员!
  17. 恒瑞、百济之外,再鼎开辟了中国医药创新又一极
  18. layui table 改变列表字体颜色
  19. 中科曙光 量子计算机,中科曙光 量子计算机 量子计算机的曙光
  20. 纯CSS实现动态晴阴雨雪

热门文章

  1. Unity_7 如何使用遮挡剔除Occlusion Culling
  2. 抖音上火的电脑代码cmd_抖音很火的:仅靠三行代码,帮妹子“修电脑”?如何做到的!...
  3. Zabbix实现企业微信报警
  4. 【壁纸】动漫绝美壁纸
  5. RocketMQ:两种消费方式:pull拉、push推
  6. 集线器Hub、交换机Switch 和 路由器Router 的区别
  7. 从零开始写第一个Flutter app(八)——修改主题颜色
  8. Liunx树莓派(ARM)开发篇—第十四章、树莓派Linux内核编译步骤(超详细、图文结合)
  9. JavaScript—有关如何实现全选/全不选、检查是否选中了复选框。
  10. 简单实现Linux下线程池