基本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相关推荐

  1. 网编编程必看书籍:unix网络编程

    unix网络编程被誉为圣经,该书主要讲socket套接字相关,socket API,从底层剖析网络编程.网络编程中需要用到的一些经典函数,多路复用函数,这些都值得去反复学习研究. 目录: 录 Part ...

  2. 《Unix网络编程卷1-套接字联网API》第一个例子编译 不通过问题解决

    <Unix网络编程卷1-套接字联网API>是本好书. 但是第一个例子不是很好编译. 需要如下步骤: 本人机器CentOS 5.4 1.下载源码 unpv13e解压到任意目录 然后按其rea ...

  3. UNIX网络编程之旅-配置unp.h头文件环境

    最近在学习Unix网络编程(UNP),书中steven在处理网络编程时只用了一个#include "unp.h"  相当有个性并且也很便捷 于是我把第三版的源代码编译实现了这个过程 ...

  4. 《UNIX网络编程 卷1:套接字联网API(第3版)》——第2章 传输层:TCP、UDP和SCTP 2.1概述...

    本节书摘来自异步社区<UNIX网络编程 卷1:套接字联网API(第3版)>一书中的第2章,第2.1节,作者:[美]W. Richard Stevens , Bill Fenner , An ...

  5. 16.unix网络编程一卷 unp.h

    unix网络编程 --ubuntu下建立编译环境 1.安装编译器,安装build-essential sudo apt-get install build-essential 2.下载本书的头文件 下 ...

  6. unix网络编程 的环境配置

    <unix网络编程> 的环境配置 首先在网上下载UNP的库文件,然后就可以安装学了.我的系统环境: 2.6.32-131.0.15.el6.i686 #1 SMP Sat Nov 12 1 ...

  7. UNIX网络编程--读书笔记

    会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...

  8. UNIX网络编程学习笔记(代码超详细解析)(持续更新)

    1. 其他函数准备 1. TCP 回射服务器程序: str_echo 函数 #include "unp.h"void str_echo(int sockfd) {ssize_t n ...

  9. 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)...

    RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三  多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...

最新文章

  1. 2022-2028年中国服装电商行业发展战略规划及投资方向研究报告
  2. arcgis server 开发
  3. 优秀的博客与文章总结链接地址
  4. php布尔类型代码,php中的boolean(布尔)类型详解
  5. DedeCms织梦彩色标签云(tag)随机颜色和字体大小
  6. android确认密码代码,Android手机卫士之确认密码对话框
  7. linux sftp目录无法切换,linux – SFTP用户无法编辑或创建文件
  8. j pocket_Wallabag:Pocket的开源替代品
  9. oracle+greatest+max,ORACLE 内置函数之 GREATEST 和 LEAST(求多列的最大值,最小值)
  10. 远程桌面管理工具比较(转)
  11. Golang 方法接收者为值与指针的区别
  12. python3 单例模式_当python,单例模式,多例模式,一次初始化遇到一起
  13. shell逻辑运算符优先级_逻辑运算符有那些?
  14. xgboost算模型输出的解释
  15. 轻量级自适应个人自动发卡源码全开源 附详细图文安装教程
  16. Android 设置半透明颜色的效果
  17. 深度学习基础(九)—— 稀疏编码(sparse coding)
  18. C#根据驱动名称获得USB串口的端口实例
  19. leetcode:祖玛游戏
  20. GBT 1.1-2020和GBT 1.2-2020最新国标PDF下载

热门文章

  1. 想了解Sleuth+zipkin分布式请求链路追踪,来看看这篇文章吧!
  2. linux关于防火墙的一些知识
  3. fiddler自动保存mysql_Fiddler模拟自动响应数据
  4. 荣耀手环5没有篮球鸿蒙,荣耀手环5和篮球版区别
  5. android cliptopadding java代码_android:clipToPadding属性的分析——以ListView的别样padding为例...
  6. spring框架所有包解释
  7. HelloCharts-android 之饼状图的使用
  8. EF修改对象里面的值。。。(对象字段多的时候)
  9. 新兴短距离无线通信技术ZigBee入门到进阶
  10. JdbcPagingItemReader多线程的Step