socket函数接口
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函数接口相关推荐
- 【C/C++服务器开发】socket网络编程函数接口详解
文章目录 一.前言 TCP 网络编程 结合三次握手连接的 TCP socket 结合四次次挥手的 TCP socket 二.socket常用函数和数据结构 1.socket()函数 2.bind() ...
- Socket中接口函数简介
文章目录 1.创建socket domain type protocol errno 2.命名socket sockaddr_in bind connect() 3.监听socket 4.接收连接 5 ...
- C语言 socket listen()函数(socket()函数创建的socket(套接字描述符)默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求)
摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被 ...
- python socket.socket()函数 套接字详解及TCP、UDP程序示例(粘包等)
文章目录 socket的定义 套接字的工作流程 socket函数使用 socket函数用法 服务端套接字函数 客户端套接字函数 公共用途的套接字函数 面向文件的套接字方法 打电话的流程演示 服务端.p ...
- socket , 套接口还是套接字,傻傻分不清楚
socket 做网络通信的朋友大都对socket这个词不会感到陌生,但是它的中文翻译是叫套接口还是套接字呢,未必大多数朋友能够分清,今天我们就来聊聊socket的中文名称. socket一词的起源 在 ...
- 三次握手 四次握手 与socket函数的关系
我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠so ...
- 【Linux】详解socket编程接口
socket编程接口详解 1. socket常见API 2. IPv4协议的地址信息结构:sockaddr_in结构体 2.1 sockaddr结构体 2.2 in_addr结构体 2.3 socka ...
- 一切皆socket!网络编程:三次握手 四次握手 与socket函数的关系
转载地址:http://www.cnblogs.com/suntp/p/6434644.html 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与w ...
- 随笔 - 58, 文章 - 0, 评论 - 0, 引用 - 0 三次握手 四次握手 与socket函数的关系
1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect()函数 3.4.a ...
最新文章
- linux创建启动连接数据库,DB2入门(1)--安装、启动、连接
- javascript中==与===的区别
- 从书上截取一段TCP三次握手和四次挥手
- 坚实原则:开放/封闭原则
- 原动力CMS PHP域名授权系统V3.0
- Linux内核深入理解中断和异常(7):中断下半部:Softirq, Tasklets and Workqueues
- 【转载】Redis在windows下安装和配置
- 卷积神经网络CNN的由来,为什么要用卷积?
- DMX512标准发送及代码整理
- MDM主数据清洗和编码集成说明
- dalek-cryptography 与adjoint-io bulletpoofs性能对比
- js初级动态随机抽人事件运用 计时器和超时期应用 解决用on事件onclick多次点击不能停止的问题
- Android OTG U盘相关
- JAVA学习日志 关于调用方法、生成对象的例子。还是用数字卦程序修改
- XML格式化在线工具
- 代码注释如此沙雕,会玩还是你们程序员!
- 恒瑞、百济之外,再鼎开辟了中国医药创新又一极
- layui table 改变列表字体颜色
- 中科曙光 量子计算机,中科曙光 量子计算机 量子计算机的曙光
- 纯CSS实现动态晴阴雨雪
热门文章
- Unity_7 如何使用遮挡剔除Occlusion Culling
- 抖音上火的电脑代码cmd_抖音很火的:仅靠三行代码,帮妹子“修电脑”?如何做到的!...
- Zabbix实现企业微信报警
- 【壁纸】动漫绝美壁纸
- RocketMQ:两种消费方式:pull拉、push推
- 集线器Hub、交换机Switch 和 路由器Router 的区别
- 从零开始写第一个Flutter app(八)——修改主题颜色
- Liunx树莓派(ARM)开发篇—第十四章、树莓派Linux内核编译步骤(超详细、图文结合)
- JavaScript—有关如何实现全选/全不选、检查是否选中了复选框。
- 简单实现Linux下线程池