UNIX 网络编程 chapter 4
基本TCP套接字编程
4.2 socket 函数
// 创建套接字文件描述符
#include <socket/socket.h>
//返回:若成功则返回非负描述符,出错则为-1
int socket(int family, int type, int protocol);
//example : socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
4.3 connect 函数
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
TCP套接字
1. 调用connect会激发TCP的“三次握手”
2. 若TCP客户没有收到SYN分节的响应, 返回ETIMEDOUT错误。
3. 客户发送SYN分节后,收到RST响应,表明在指定的端口上没有进程在等待与之连接, 返回ECONNREFUSES错误。
4. 若客户发送的SYN在中间某个路由器上引起了一个"destination unreachable"ICMP错误. 返回EHOSTUNREACH 或 ENETUNTREACH错误
5.调用connect失败后,都必须调用close函数关闭当前的套接字,如要再次调用connect函数,必须先重新调用socket函数
产生RST的三个条件:
目的地为某端口的SYN到达,然而该端口上没有正在监听的服务器;
TCP想取消一个已有连接;
TCP接收到一个根本不存在的连接上的分节。
4.4 bind 函数
int bind(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); // 成功返回0,出错返回-1//IPv4 通配地址
struct sockaddr_in servaddr;
servaddr.sin_addr.s_addr = htonl (INADDR_ANY);
//IPv6 通配地址
struct sockaddr_in6 servaddr6;
servaddr.sin6_addr= in6addr_any;
进程绑定非通配IP地址到套接字上的常见例子是为多个组织提供web服务器的主机上(unp/v3/P83 挺有意思)
bind函数返回的常见错误是EADDRINUSE:地址已经被使用
4.5 listen 函数
int listen (int sockfd, int backlog)
//成功:返回0,出错则返回-1
backlog: 内核应该为相应套接字排队的最大连接个数
内核为每个监听的套接字维护两个队列
:
未完成连接队列:
由某个客户端发出并到达服务器,而服务器正在等待完成相应的TCP三路握手过程,这些套接字处于SYN_RCD状态
已完成连接队列:
每个已完成三次握手过程的客户对应其中一项。这些套接字处于ESTABLISHED状态。
未完成连接队列的个数+已完成连接队列的个数不超过backlog
4.10 getpeername 和 getsockname
getsockname返回与某个套接字关联的本地协议地址,getpeername返回与某个套接字关联的外地协议地址。
struct sockaddr_in cltaddr;socklen_t len = sizeof (cltaddr);if (getsockname(sockfd, (struct sockaddr*)(&cltaddr), &len) < 0){err_sys("getsockname err.");
}
UNIX 网络编程 chapter 4相关推荐
- 网编编程必看书籍:unix网络编程
unix网络编程被誉为圣经,该书主要讲socket套接字相关,socket API,从底层剖析网络编程.网络编程中需要用到的一些经典函数,多路复用函数,这些都值得去反复学习研究. 目录: 录 Part ...
- 《Unix网络编程卷1-套接字联网API》第一个例子编译 不通过问题解决
<Unix网络编程卷1-套接字联网API>是本好书. 但是第一个例子不是很好编译. 需要如下步骤: 本人机器CentOS 5.4 1.下载源码 unpv13e解压到任意目录 然后按其rea ...
- UNIX网络编程之旅-配置unp.h头文件环境
最近在学习Unix网络编程(UNP),书中steven在处理网络编程时只用了一个#include "unp.h" 相当有个性并且也很便捷 于是我把第三版的源代码编译实现了这个过程 ...
- 《UNIX网络编程 卷1:套接字联网API(第3版)》——第2章 传输层:TCP、UDP和SCTP 2.1概述...
本节书摘来自异步社区<UNIX网络编程 卷1:套接字联网API(第3版)>一书中的第2章,第2.1节,作者:[美]W. Richard Stevens , Bill Fenner , An ...
- 16.unix网络编程一卷 unp.h
unix网络编程 --ubuntu下建立编译环境 1.安装编译器,安装build-essential sudo apt-get install build-essential 2.下载本书的头文件 下 ...
- unix网络编程 的环境配置
<unix网络编程> 的环境配置 首先在网上下载UNP的库文件,然后就可以安装学了.我的系统环境: 2.6.32-131.0.15.el6.i686 #1 SMP Sat Nov 12 1 ...
- UNIX网络编程--读书笔记
会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...
- UNIX网络编程学习笔记(代码超详细解析)(持续更新)
1. 其他函数准备 1. TCP 回射服务器程序: str_echo 函数 #include "unp.h"void str_echo(int sockfd) {ssize_t n ...
- 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)...
RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三 多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...
最新文章
- 2022-2028年中国服装电商行业发展战略规划及投资方向研究报告
- arcgis server 开发
- 优秀的博客与文章总结链接地址
- php布尔类型代码,php中的boolean(布尔)类型详解
- DedeCms织梦彩色标签云(tag)随机颜色和字体大小
- android确认密码代码,Android手机卫士之确认密码对话框
- linux sftp目录无法切换,linux – SFTP用户无法编辑或创建文件
- j pocket_Wallabag:Pocket的开源替代品
- oracle+greatest+max,ORACLE 内置函数之 GREATEST 和 LEAST(求多列的最大值,最小值)
- 远程桌面管理工具比较(转)
- Golang 方法接收者为值与指针的区别
- python3 单例模式_当python,单例模式,多例模式,一次初始化遇到一起
- shell逻辑运算符优先级_逻辑运算符有那些?
- xgboost算模型输出的解释
- 轻量级自适应个人自动发卡源码全开源 附详细图文安装教程
- Android 设置半透明颜色的效果
- 深度学习基础(九)—— 稀疏编码(sparse coding)
- C#根据驱动名称获得USB串口的端口实例
- leetcode:祖玛游戏
- GBT 1.1-2020和GBT 1.2-2020最新国标PDF下载
热门文章
- 想了解Sleuth+zipkin分布式请求链路追踪,来看看这篇文章吧!
- linux关于防火墙的一些知识
- fiddler自动保存mysql_Fiddler模拟自动响应数据
- 荣耀手环5没有篮球鸿蒙,荣耀手环5和篮球版区别
- android cliptopadding java代码_android:clipToPadding属性的分析——以ListView的别样padding为例...
- spring框架所有包解释
- HelloCharts-android 之饼状图的使用
- EF修改对象里面的值。。。(对象字段多的时候)
- 新兴短距离无线通信技术ZigBee入门到进阶
- JdbcPagingItemReader多线程的Step