前言

在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通信函数的更多相关文章

  1. 几个经典的TCP通信函数

    前言 在TCP通信中要使用到几个非常经典的函数( 点这里参考一个关于它们作用的形象比方 ),本文将对这几个函数进行一个简短的使用说明. socket函数 函数作用:创建一个网际字节流套接字 包含头文件 ...

  2. 【Java TCP/IP Socket】深入剖析socket——TCP通信中由于底层队列填满而造成的死锁问题(含代码)

    基础准备 首先需要明白数据传输的底层实现机制,在http://blog.csdn.net/ns_code/article/details/15813809这篇博客中有详细的介绍,在上面的博客中,我们提 ...

  3. 理论经典:TCP协议的3次握手与4次挥手过程详解

    1.前言 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务.TCP提供一种面向连接的.可靠的字节流服务. 面向连接意味着两个使用TCP的应用(通常是一个客户和一 ...

  4. Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)

    Python开发[第七篇]:面向对象   详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇)   上一篇<Python 面向对象(初级篇)> ...

  5. ElasticSearch入门 第七篇:分词

    这是ElasticSearch 2.4 版本系列的第七篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  6. 解剖SQLSERVER 第七篇 OrcaMDF 特性概述(译)

    解剖SQLSERVER 第七篇  OrcaMDF 特性概述(译) http://improve.dk/orcamdf-feature-recap/ 时间过得真快,这已经过了大概四个月了自从我最初介绍我 ...

  7. 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...

  8. 第七篇 Replication:合并复制-订阅

    本篇文章是SQL Server Replication系列的第七篇,详细内容请参考原文. 订阅服务器就是复制发布项目的所有变更将传送到的服务器.每一个发布需要至少一个订阅,但是一个发布可以有多个订阅. ...

  9. 第七篇 Integration Services:中级工作流管理

    本篇文章是Integration Services系列的第七篇,详细内容请参考原文. 简介在上一篇文章,我们创建了一个新的SSIS包,学习了SSIS中的脚本任务和优先约束,并检查包的MaxConcur ...

随机推荐

  1. jQuery (二)DOM 操作

    一般jquery在web项目的只要作用就是取值和赋值了. 下面了入门下,这些值得获取. <!DOCTYPE html> <html> <head> <meta ...

  2. Java中HashMap实现原理

    类声明: 概述: 线程不安全: <Key, Value>两者都可以为null: 不保证映射的顺序,特别是它不保证该顺序恒久不变: HashMap使用Iterator: HashMap中ha ...

  3. Qt5 can't find -LGL

    一周前新建了一个有关Ubuntu QT5 的虚拟机开发环境,在官网上下载了一个完整的run包,然后编译的时候发现如下错误 can't find -LGL 解决方式: sudo apt-get inst ...

  4. Testng 的数据源 驱动測试 代码与配置

    JUnit中有讲述使用注解的方式进行数据源读取进行自己主动循环測试的方法,在TestNG中也提供了对应的方法 public class TestngDataProvider { /** * 数组内的每 ...

  5. jar/war/ear文件的区别

     jar/war/ear三种文件,在文件结构上,三者并没有什么不同,它们都采用zip或jar档案文件压缩格式.但是它们的使用目的有所区别: Jar文件(扩展名为. Jar)包含Java类的普通库.资源 ...

  6. 实现对div的显示隐藏

    jQuery对div的显示和隐藏: 显示: 复制代码 代码如下:$("#id").show() 隐藏: 复制代码 代码如下: $("#id").show() j ...

  7. Framework 7 之 给Picker Modal 添加半透明背景

    官网的效果图如下: 效果图如下: 我们需要在显示下面浮层的时候显示后面的半透明背景,Framework 7 里面默认有个半透明背景,如下图: 解决方案: 1.在</body>标签之前添加& ...

  8. ElasticSearch0910学习

    1:es简介 es是一个分布式的搜索引擎,使用java开发,底层使用lucene. 特点:天生支持分布式的.为大数据而生的.基于restful接口. 2:es和solr对比 接口 solr:类似web ...

  9. ROS 教程之 vision : 用各种摄像头获取图像

    可能有很多人想在ROS下学习视觉,先用摄像头获取图像,再用opencv做相应算法处理,可是ROS下图像的采集可不像平常的read一下那么简单,需要借助外部package的使用.而摄像头即可以用笔记本自 ...

  10. if、for、while、do 等语句自占一行

    if.for.while.do 等语句自占一行,执行语句不得紧跟其后.不论 执行语句有多少都要加{}.这样可以防止书写失误. #include <iostream> /* run this ...