想不想自己写一个简单的QQ?想不想自己写一个聊天室?想不想知道2000年的人是如何上网的?本节讲解一些基础的网络函数,带你看看,编写一个完整的TCP客户端、服务端需要掌握哪些函数?之后,我们要开发自己的QQ。

1 socket函数

// sys/socket.h
/* 使用协议__protocol在域__domain中创建一个__type类型的新套接字。 如果__protocol为零,则自动选择一个。 返回新套接字的文件描述符,或者返回-1表示错误。
*/
extern int socket (int __domain, int __type, int __protocol) __THROW;

  • __domain:即family,AF_INETIPv4协议,AF_INET6IPv6协议
  • __typeSOCK_STREAM字节流套接字,SOCK_DGRAM数据报套接字,SOCK_RAW原始套接字
  • __protocolIPPROTO_TCPTCP传输协议,IPPROTO_UDPUDP传输协议

socket函数在成功时返回一个小的非负整数值,它与文件描述符类似,我们把它称为套接字描述符(socket descriptor),简称socketfd。

AF_前缀表示地址族,PF_前缀表示协议族 ,因为历史上曾想让一个协议族(PF)支持多个地址族(AF),用PF来创建套接字,用AF来创建套接字地址结构,然而就只是想想,没有实现。现在AF和PF的值是相等的。

// bits/socket.h
/* Protocol families.  */
#define PF_INET     2   /* IP protocol family.  */
#define PF_INET6    10  /* IP version 6.  */
/* Address families.  */
#define AF_INET     PF_INET
#define AF_INET6    PF_INET6 

2 connect函数

// sys/socket.h
#define __CONST_SOCKADDR_ARG   const struct sockaddr *
extern int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);

  • __fd:socket函数返回的套接字描述符
  • __addr:指向套接字结构地址的指针
  • __len:该套接字的大小

TCP客户用connect函数和TCP服务器建立连接。客户在调用connect函数前可以不调用bind函数,因为如果有需要,内核会确定本机IP地址,并选择一个临时端口作为源端口。

3 bind函数

// sys/socket.h
/* 把一个本地协议地址赋值给一个套接字 */
#define __CONST_SOCKADDR_ARG   const struct sockaddr *
extern int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) __THROW;

  • 对于IPv4来说,协议地址是32位的IPv4地址和16位的端口号组合。
  • 对于IPv6来说,协议地址是128位的IPv6地址和16位的端口号组合。

绑定操作涉及3个对象:套接字,地址和端口。其中套接字是捆绑的主体,地址和端口是捆绑的客体。在套接字上绑定地址和端口表示:该地址和端口已经被套接字使用。

  • 如果指定端口号为0,那么内核在bind被调用的时候选择一个临时端口。
  • 如果指定IP地址是通配地址,那么内核将等到套接字已连接(TCP)或在套接字上发出数据报(UDP)时才选择一个本地IP地址。

对于IPv4来说,通配地址是0(INADDR_ANY),如果让内核帮套接字选择一个端口,那么必须注意,bind函数并不返回所选择的端口号。因为bind函数的_addr参数有const限定词,它无法返回所选的值。为了拿到内核选择的临时端口,必须调用getsockname函数来返回协议地址。

4 listen函数

// sys/socket.h
extern int listen (int __fd, int __n) __THROW;

listen函数仅有TCP服务器调用,它做两件事:

  1. 当socket函数创建一个套接字时,默认是主动套接字,listen函数将它变成被动套接字,指示内核应接受指向该套接字的连接请求。调用listen将导致套接字从CLOSED状态转换到LISTEN状态。
  2. 第二个参数__n规定了内核应该为相应套接字排队的最大连接个数。内核为任意一个监听套接字维护两个队列,一个叫未完成连接队列,一个叫已完成队列
  • 未完成连接队列:每个处于三次握手中的TCP连接,套接字处于SYN_RCVD状态。
  • 已完成连接队列:每个已完成三次握手的TCP连接,套接字处于ESTABLISHED状态。

这2个队列之和不能超过__n,否则就无法新建TCP连接,这就是SYN Flood攻击的原理。

5 accept函数

// sys/socket.h
extern int accept (int __fd, __SOCKADDR_ARG __addr,socklen_t *__restrict __addr_len);

accept函数由TCP服务器调用,用于从已完成连接队列的队头返回下一个已完成连接。如果该队列为空,那么进程被投入睡眠。(默认套接字为阻塞方式)

参数__addr__addr_len返回已连接的对端进程的协议地址,即返回客户端的协议地址。__addr_len是值-结果参数,返回内核存放在协议地址中实际的字节数。如果对客户端的协议地址不感兴趣,可以将指针置为NULL。

注意:如果accept成功,返回值是又内核自动生成的全新描述符,称为已连接套接字。服务端与客户通信,将用这个套接字,服务完成后,这个套接字就被关闭。 而参数__fd称为监听套接字, 一个服务仅仅创建一个监听套接字

6 close函数

// /usr/include/unistd.h
extern int close (int __fd);

close函数一般可以用来关闭套接字,并终止TCP连接。但是在并发服务器中,close函数仅仅将套接字描述符引用计数减1。所以并不能一定在TCP连接上发送FIN报文,如果想在TCP连接上发送FIN报文,可以用shutdown函数。

参考文献:《UNIX网络编程 卷1:套接字联网API》

accept函数_基础套接字函数入门1相关推荐

  1. tcp/ip网络编程--accept()函数返回的套接字

    tcp/ip网络编程–accept()函数返回的套接字 套接字:1)套接字是对网络中不同主机的应用进程之间进行双向通信的端点的抽象:一个套接字就是网络进程通信的一端.[1] 2)套接字是用来与另一个进 ...

  2. listen()和accept()函数:让套接字进入监听状态并响应客户端请求

    对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了. listen() 函数 ...

  3. python unique函数_《Python编程从入门到实践》json数据可视化练习详解

    <Python编程从入门到实践>16.2中,计算收盘价均值的程序有些不易看懂,结合我自己的理解进行一些说明. 使用的数据集:join格式的数据, 数据集是由多个字典为元素组成的列表.每个字 ...

  4. matlab eye函数_[线性代数系列1] MATLAB入门笔记

    MATLAB基础知识入门 1. 创建矩阵 创建矩阵最直接的方式:在方括号内填入数字,空格或者逗号间隔为列,回车或分号间隔为行. >> A = [1 2; 3 4; 5 -6]A =1 23 ...

  5. java peek函数_基础篇:JAVA.Stream函数,优雅的数据流操作

    写在开头:本文是转载于掘金上的一篇文章,已获得原作者授权,我会在文章最后放上原作者和原文链接. 前言 平时操作集合数据,我们一般都是for或者iterator去遍历,不是很好看.java提供了Stre ...

  6. mysql cbrt函数_基础方法或属性: 列表,元组,字典,字符串,集合及内置函数等(注:只有英文名)...

    列表 list append clear copy count extend index insert pop remove reverse sort 元组 tuple count index 字典 ...

  7. TCP的listen和accept函数

    int listen(int sockfd, int backlog); 完成两件事情: 1.将未连接的套接口转换成被动套接口,指示内核应接收指向此套 接的 连接请求.       导致套接口从CLO ...

  8. python入门之函数调用内置函数_第九篇 python基础之函数,递归,内置函数

    阅读目录 一 数学定义的函数与python中的函数 二 为何使用函数 背景提要 三 函数和过程 四 函数参数 五 局部变量和全局变量 六 前向引用之'函数即变量' 七 嵌套函数和作用域 八 递归调用 ...

  9. 1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

     1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端 ...

最新文章

  1. WebBrowser组件和MSHTML
  2. 前端基础之设计一个个人工作室介绍界面
  3. ASP.NET Core 日志框架:Serilog
  4. Linux基础命令---文本显示od
  5. 更改via浏览器字体_【安卓】我心中的最佳手机浏览器
  6. php中header用法
  7. JavaScript(一)基本语法
  8. ios 简书 获取通讯录信息_ios 获取本地通讯录信息
  9. OpenCV 二值化
  10. PKPM200608/CARD-1 8.0/TPM5000/神机妙算(黄狗)/桥梁通7.09/福莱一点通8.3/纬地5.82
  11. 高压输电线路线夹温度监测系统装置
  12. DELL PERC 系列阵列卡详解
  13. Shim、Polyfill
  14. Mybatis复杂查询(详细举例)
  15. AIE功能介孔二氧化硅/环糊精辅助的荧光二氧化硅纳米粒子/α-环糊精改性SiO2纳米微球/基于MOFs或中空介孔二氧化硅复合载体
  16. 语法树的Java代码自动化插桩
  17. Delphi Web前端开发教程(9):基于TMS WEB Core框架
  18. dvd光驱在计算机内怎么找不到,电脑DVD光驱消失找不到怎么处理
  19. xgboost:防止过拟合的方法收缩和特征列、采样
  20. LR-微信订车压力测试

热门文章

  1. Github 精选:13 款炼丹利器,有开源工具包也有超大数据集
  2. 深度学习:Neural Network Layers Understanding
  3. 消息中间件和JMS介绍
  4. IDEA代码生成插件CodeMaker
  5. Java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)
  6. K-Means 聚类实例sample
  7. 概率统计:第一章 概率论的基本概念
  8. 七步精通Python机器学习
  9. Machine Learning week 8 quiz: Principal Component Analysis
  10. 2015年百度三面试题