为了执行网络I/O操作.进程必须做的第一件事情就是调用Socket函数.指定期待的通信协议

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

family表示协议族,比如AF_INET,type表示套接字类型, protocol一般设置为0
family: AF_INET ipv4协议
type: SOCK_STREAM 字节流套接字 SOCK_DGRAM 数据报套接字 SOCK_RAW 原始套接字
protocol:一般是设置为0

connect函数
  1. #include<sys/socket.h>
  2. int connect(int sockfd,const struct sockaddr*servaddr,socklen_t addrlen);
该套接字结构必须含有服务器的ip地址.客户端在调用connect之前不用bind.因为一般不需要知道客户端的ip跟端口.因此不调用bind直接connect.内核会指定一个本地地址跟一个临时端口

TCP中connect函数将激发tcp三次握手过程.只有建立成功或者出错时才会返回,其中出错的返回有以下3种情况
(1)客户端木有收到syn发送出去后服务端返回的ack.一般无响应会再次发送.一旦还没收到.就会返回etimedout错误.表示超时
(2).对客户端的SYN响应是RST.客户端一旦收到马上返回ECONNREFUSED错误
(3)客户端发出的syn在中间的某个路由器引发了一个"destination unreachable(目标无法到达)ICMP错误.客户主机将保存该信息,并按第一种情况间隔一段时间继续发送SYN.如果在某个规定的时间依然没有收到响应.就把保存的信息作为ehostunreach错误返回给进程.以下两种情况也有可能:按照本地系统转发表,没有到达远程系统的路径.connect调用根本不等待就返回

bind函数
bind把一个本地协议地址(ipv4 or ipv6)跟端口(2者非必须)绑定到一个套接字中.
  1. #include<sys/socket.h>
  2. int bind(int sockfd,const struct sockaddr*myaddr,socklen_t addrlen);
  3. //成功返回0.出错返回-1


LIsten函数
(1)listen函数只由tcp服务端调用
当socket创建一个套接字的时候.被假设为一个主动套接子.listen则把一个为未连接的套接字转为一个被动套接字.指示内核应该接受该套接字的连接请求
(2)此函数第2个参数规定了内核应该为相应套接字排队的最大连接个数
  1. #include<sys/socket.h>
  2. int listen(int sockfd,int backlog);
  3. 返回:成功返回0.失败返回-1
内核为任何一个给定的监听套接字维护2个队列
(1) 未完成连接队列(syn_recd)(2).已完成队列(处于established)
二者连接之和不超过backlog
在三路握手正常完成的前提下.未完成连接队列中的任何一项在其中停留时间为RTT
一个客户SYN到达时,如果这些队列是满的,tcp就会忽略该分节,也就不是不会发送RST,客户端TCP将会重发SYN,期待不就将来可以在这些队列找到可用队列



accept函数
由tcp服务器调用,用于从已完成连接队列队头返回下一个已完成连接,如果连接队列为空,进程将被休眠
  1. #include<sys/socket.h>
  2. int accept(int sockfd,struct sockaddr*cliaddr,socklen_t *addrlen);
  3. 返回:若成功返回非负描述符,若出错则为-1

 close函数
把一个tcp套接字标记为已关闭.返回到调用进程.该套接字描述符不能再由调用进程使用.
不过如果父进程fork了一个子进程.即使子进程close套接字描述符,子进程不能再读写该套接字描述符.
但父进程依旧可以读写该被子进程关闭的套接字,原因:文件表的引用计数.

以上是基于TCP/IP的套接字函数调用过程


getsockname跟getpeername函数
前一个番号跟某个套接字关联的本地套接字结构.后一个番号跟某个套接字的对端套接字结构














 

unix网络编程第四章----基于TCP套接字编程的更多相关文章

  1. 【UNIX网络编程(四)】TCP套接字编程具体分析

    引言: 套接字编程事实上跟进程间通信有一定的相似性,可能也正由于此.stevens这位大神才会将套接字编程与进程间的通信都归为"网络编程",并分别写成了两本书<UNP1> ...

  2. UNP学习笔记(第四章 基本TCP套接字编程)

    本章讲解编写一个完整的TCP客户/服务器程序所需要的基本套接字函数. socket函数 #include <sys/socket.h> int socket(int family,int ...

  3. 第四章 基本TCP套接字编程 第五章 TCP客户/服务器程序实例

    TCP客户与服务器进程之间发生的重大事件时间表 TCP服务器 socket() --- bind() --- listen() --- accept() --- read() --- write -- ...

  4. UNP——第四章,TCP套接字编程

    1.socket 函数 首先被调用的函数,用于选择通信协议. socket调用成功后,得到的套接字为主动套接字CLOSED状态. PF 和 AF 的关系 PF的是协议族,AF是地址族,理论上一个PF包 ...

  5. UNIX网络编程 第4章 基本TCP套接字编程

    本章的几个函数在很大程度上展示了面向对象与面向过程的不同之处.

  6. 套接字编程相关函数(2:TCP套接字编程相关函数)

    本文摘录自<UNIX网络编程 卷1>. 基本套接字函数 socket函数 为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型.其定义如下: #in ...

  7. UNIX网络编程 第8章 基本UDP套接字编程

    UDP是无连接的,不需要accept,TCP通过accept API来接受连接,并且将连接客户端的信息写入到accept将返回的新socket中,该新socket中有服务端和客户端的IP地址和端口,因 ...

  8. TCP套接字编程模型及实例

    摘要:     本文讲述了TCP套接字编程模块,包括服务器端的创建套接字.绑定.监听.接受.读/写.终止连接,客户端的创建套接字.连接.读/写.终止连接.先给出实例,进而结合代码分析. PS:本文权当 ...

  9. UNP学习笔记1——基本TCP套接字编程

    1 套接字地址结构 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数.每个协议族都定义了自己的套接字结构.这些套接字的结构以sockaddr_开头,以每个协议族唯一的后缀名结尾. 1.1 I ...

随机推荐

  1. Title Case a Sentence-freecodecamp算法题目

    Title Case a Sentence(中单词首字母大写) 要求 确保字符串的每个单词首字母都大写,其余部分小写. 像'the'和'of'这样的连接符同理. 思路 将句子小写化后用.split(& ...

  2. NOIP2016——一个逗号引发的血案

    今年江西省报名人数一下子增起来了 隔壁中学来了80+人(虽然都是来给我们垫底的...临时被老师抓来上战场 总之我们赛区参赛人数总算多起来了(起码没再减50%...连续4年减50%真不是随便说说的... ...

  3. luogu4608 [FJOI2016]所有公共子序列问题

    题目描述: luogu loj 题解: 序列自动机(?)+高精+普及dp. 这个是猫老师的序列自动机(字符串从1开始): ]) { memset(t[n],-,sizeof(t[n])); ;i> ...

  4. 【动态规划】bzoj1584: [Usaco2009 Mar]Cleaning Up 打扫卫生

    思路自然的巧妙dp Description 有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000.现在Farmer John要把这些奶牛分 ...

  5. linux关于进程、内存和cpu情况

    1.load average: 2.03, 1.76, 1.80 1分钟.5分钟.15分钟平均负载 2.%Cpu(s):100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa ...

  6. H5(一)H5与HTML、XHTML的不同

    一.基本概念 html:超文本标记语言 (Hyper Text Markup Language) xhtml:可扩展超文本标记语言,是一种置标语言,表现方式与超文本标记语言(HTML)类似,不过语法上 ...

  7. 如何用 CSS 和 D3 创作一个无尽的六边形空间

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/NBvrWL 可交互视频 此视频是可 ...

  8. python numpy复制array

    numpy快速复制array 前段时间想到一个算法,需要实现array的自我复制,直接上代码,两种复制方式, 整体复制 a=[[10,10,50,50],[10,10,40,50]] np.tile( ...

  9. Django之用户认证

    用户认证组件简介 功能:用session记录登录验证状态 前提:必须使用django自带的auth_user表.那这里有的同学就会有疑问了,自己不能创建自己的用户表吗? 当然可以,用户认证组件虽然只针 ...

  10. csapp-15213错误修正18-10-28

    1.p229 练习题3.15 b.答案错误,应为400419