第七篇:几个经典的TCP通信函数
前言
在TCP通信中要使用到几个非常经典的函数,本文将对这几个函数进行一个简短的使用说明。
socket()函数
函数作用:创建一个网际字节流套接字
包含头文件:sys/socket.h ( 后面几个函数也一样 )
函数原型:int socket ( int family, int type, int protocol )
参数说明:
family:指明协议族( 如AF_INET,AF_INET6,AF_LOCAL等 )
type:指明套接字类型( 如SOCK_STREAM,SOCK_DGRAM等 )
protocol:直接指明某种 family 和 type 的组合而无视前2个参数,如下图( 如果该参数为0则启用family和type的组合类型 ):

返回值说明:成功返回描述符,失败返回-1。
connect()函数
函数作用:与指定主机进行连接
函数原型:int connect ( int sockfd, const struct sockaddr *servaddr, socklen_t addrlen );
参数说明:
sockfd:要建立连接的套接字(连接是以套接字为单位建立而不是主机 )
servaddr:要连接主机的套接字地址结构
addrlen:servaddr的大小
返回值说明:若成功返回0,失败返回-1。
特别说明:
1. 该函数将激发三次握手
2. 如果TCP客户没有收到SYN分节响应,则返回ETIMEOUT错误。
3. 如果对客户的SYN的响应是RST,则表示SYN分节正确送到但没有服务,或者对方想取消这次连接,或者TCP接收到一个根本不存在的连接上的分节。这种情况将返回ECONNREFUSED错误。
4. 如果客户发出的SYN分节在路由传递过程中出现了问题( 路由器返回主机不可达 ),则将返回EHOSTUNREACH或者ENETUNREACH错误。
bind()函数
函数作用:把一个本地地址赋予一个套接字
函数原型:int bind ( int sockfd, const struct sockaddr * myaddr, socklen_t addrlen )
参数说明:
sockfd:要绑定的套接字
myaddr:要绑定的套接字地址结构
addrlen:上述结构的大小
返回值说明:若成功返回0,失败返回-1。
特别说明:一般情况,服务器绑定一个INADDR_ANY( 任意型 )的地址就可以了,客户端不用绑定。
listen()函数
函数作用:把一个未连接的套接字转换成被动套接字
函数原型:int listen ( int sockfd, int backlog )
参数说明:
sockfd:要转换的套接字
backlog:未完成队列+已完成队列的长度和
返回值说明:若成功返回0,失败返回-1。
accept函数
函数作用:从已完成队列返回下一个已完成连接。
函数原型:int accept ( int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen )
参数说明:
sockfd:监听套接字描述符
cliaddr:请求连接端的套接字地址结构
addrlen:cliaddr的大小
返回值说明:若成功返回非负描述符,失败返回-1。
特别说明:
1.一般情况下,一个服务器仅仅只有一个监听套接字,但是对每个服务请求都会创建一个已连接套接字。
2.已连接套接字在每次循环后都会关闭,但监听套接字在服务器有效期间都会开放。
第七篇:几个经典的TCP通信函数的更多相关文章
- 几个经典的TCP通信函数
前言 在TCP通信中要使用到几个非常经典的函数( 点这里参考一个关于它们作用的形象比方 ),本文将对这几个函数进行一个简短的使用说明. socket函数 函数作用:创建一个网际字节流套接字 包含头文件 ...
- 【Java TCP/IP Socket】深入剖析socket——TCP通信中由于底层队列填满而造成的死锁问题(含代码)
基础准备 首先需要明白数据传输的底层实现机制,在http://blog.csdn.net/ns_code/article/details/15813809这篇博客中有详细的介绍,在上面的博客中,我们提 ...
- 理论经典:TCP协议的3次握手与4次挥手过程详解
1.前言 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务.TCP提供一种面向连接的.可靠的字节流服务. 面向连接意味着两个使用TCP的应用(通常是一个客户和一 ...
- Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)
Python开发[第七篇]:面向对象 详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)> ...
- ElasticSearch入门 第七篇:分词
这是ElasticSearch 2.4 版本系列的第七篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- 解剖SQLSERVER 第七篇 OrcaMDF 特性概述(译)
解剖SQLSERVER 第七篇 OrcaMDF 特性概述(译) http://improve.dk/orcamdf-feature-recap/ 时间过得真快,这已经过了大概四个月了自从我最初介绍我 ...
- 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...
- 第七篇 Replication:合并复制-订阅
本篇文章是SQL Server Replication系列的第七篇,详细内容请参考原文. 订阅服务器就是复制发布项目的所有变更将传送到的服务器.每一个发布需要至少一个订阅,但是一个发布可以有多个订阅. ...
- 第七篇 Integration Services:中级工作流管理
本篇文章是Integration Services系列的第七篇,详细内容请参考原文. 简介在上一篇文章,我们创建了一个新的SSIS包,学习了SSIS中的脚本任务和优先约束,并检查包的MaxConcur ...
随机推荐
- 第2章 初学 emWin 的准备工作及其快速上手
以下内容转载自安富莱电子论坛:http://forum.armfly.com/forum.php?mod=viewthread&tid=24552&extra=page%3D3%26f ...
- iOS调用其它App,如拨打电话、发送邮件等。UIApplication:openURL:方法是实现这一目的的
在iOS开发中,经常需要调用其它App,如拨打电话.发送邮件等.UIApplication:openURL:方法是实现这一目的的最简单方法,该方法一般通过提供的url参数的模式来调用不同的App. 通 ...
- python idea 利用树莓派做家庭报警系统
1 利用树莓派做家庭报警系统idea 功能如下: 1.程序家侧人不在家(7:00-6:00) 2.树莓派搭配摄像头,对这门进行图像识别,如果变化,门开了,就报警: 3.报警的方式是给我发短信,采信,或 ...
- git学习(三):git暂存区
回顾之前学过的命令: git init // 初始化一个项目 git add // 将文件交给工作区 git commit // 提交修改 查看提交日志: git log // 查看提交日志 git ...
- u-boot 2011.09 使用自己的board 以及config.h
一个新的方案,用的UBOOT 可能和上一个方案是同一个,但是配置有可能不一样,今天记录一下通过修改配置文件使用新的 board 文件以及 config.h 进入 u-boot 2011.09 // 打 ...
- kubernetes 数据持久化
pod本身是无状态,所以很多有状态的应用,就需要将数据进行持久化. 1:将数据挂在到宿主机.但是pod重启之后有可能到另外一个节点,这样数据虽然不会丢但是还是有可能会找不到 apiVersion: v ...
- CentOS ext4 磁盘分区 格式化 挂载
[root@appserver ~]# df -h /*查看现有分区情况*/文件系统 容量 已用 可用 已用%% 挂载点/dev/vda1 9.9G 8.2G 1.2G 88% /tmpfs 3.9G ...
- DataGridView使用技巧九:DataGridView的右键菜单(ContextMenuStrip)
DataGridView,DataGridViewColumn,DataGridViewRow,DataGridViewCell有ContextMenuStrip属性.可以通过设置ContextMen ...
- HTML(二):表格元素
表格元素的作用:用来格式化显示数据. 一.表格的基本结构 表格的基本语法:<TABLE border="设置表格边框尺寸大小" width="" cell ...
- 字符串移位:如“abcdefghi”右移2位后变成“cdefghiab”
函数头: //pStr 是指向以'\0'结尾的字符串指针 //steps 是要求移动的步数 void LoopMove(char *pStr, int steps) { //...... } 使用库函 ...