网络通讯的介绍、与实现
2017-07-21 11:27
281 查看
Socket的由来
我们可以使用用Socket中的相关函数来完成通信, 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为Socket(套接字)的接口如图1所示:
Socket的简介
Socket是通信端点的抽象,它被认为是一种特殊的管道,但和管道不同的是,它对于容纳的数据的大小没有限制。Socket接口是网络应用程序编程接口。Socket接口层位于应用程序与协议栈之间,对应用程序屏蔽了协议的实现细节,为应用程序提供统一的接口:Socket接口。创建socket时,指定所需的的域和类型,应用程序可以用相同的接口(Socket接口)使用不同的协议族。
1、socket函数
包含头文件<sys/socket.h> 功能:创建一个套接字用于通信
原型:int socket(int domain, int type, int protocol);
1.1 域
domain参数有如下:AF_UNIX (AF_LOCAL)UNIX域协议(文件系统套接字)
AF_INET ARPA因特网协议(UNIX网络套接字)
AF_ISO ISO标准协议
AF_NS 施乐(XEROX)网络系统协议
AF_IPX NOVELL IPX协议
AF_APPLETALK
Appletalk DDS
Linux下,网络协议(网络传输中的一项规则,如TCP/IP、HTTP、FTP协议等)被映射成多个域(domain),也就是socket函数中的domain。我们常用的是:AF_INET和AF_UNIX,AF_INET套接字可以用于通过包括因特网在内的TCP/IP网络进行通信的程序。
1.2 类型
type:指定socket通信的特性,它的取值分为流式套接字SOCK_STREAM,数据报套接字SOCK_DGRAM,原始套接字SOCK_RAWSOCK_DGRAM是数据包服务,我们可以用它来发送最大长度固定的消息。但消息是否会被正确传递或消息是否不会乱序到达没有保证。在AF_INET域中通过UDP/IP连接实现,它提供的是一种无需的不可靠服务。
SOCK_RAW原始套接字服务。提供一个数据报接口直接访问IP层。绕过传输层协议,需要应用程序构造协议首部。
1.3 协议类型
protocol :协议类型,IPPROTO_TCP等;一般由前两个参数就决定了协议类型,设置为0即可。 通常为0,表示按给定的域和套接字类型选择默认协议。当同一域和套接字类型支持多个协议时,可以通过protocal(协议)参数选择特定的协议。
1.4 返回值
返回值:成功返回非负整数, 它与文件描述符类似,我们把它称为套接口描述字,简称套接字。失败返回-1
2、bind函数
包含头文件<sys/socket.h> 功能:绑定一个本地地址到套接字
原型:int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数
sockfd:socket函数返回的套接字
addr:要绑定的地址
addrlen:地址长度
返回值:成功返回0,失败返回-1
3、listen函数
包含头文件<sys/socket.h> 功能:将套接字用于监听进入的连接
原型:int listen(int sockfd, int backlog);
参数
sockfd:socket函数返回的套接字
backlog:规定内核为此套接字排队的最大连接个数
返回值:成功返回0,失败返回-1
4、accept函数
包含头文件<sys/socket.h> 功能:从已完成连接队列返回第一个连接,如果已完成连接队列为空,则阻塞。
原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数
sockfd:服务器套接字
addr:将返回对等方的套接字地址
addrlen:返回对等方的套接字地址长度
返回值:成功返回非负整数,失败返回-1
5、connect函数
包含头文件<sys/socket.h> 功能:建立一个连接至addr所指定的套接字
原型:int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数
sockfd:未连接套接字
addr:要连接的套接字地址
addrlen:第二个参数addr长度
返回值:成功返回0,失败返回-1
下图是基于TCP协议的客户端/服务器程序的一般流程,我们可以使用上述函数实现:
图2:
相关文章推荐
- [连载]《C#通讯(串口和网络)框架的设计与实现》-1.通讯框架介绍
- [连载]《C#通讯(串口和网络)框架的设计与实现》-1.通讯框架介绍
- C#实现基于TCP协议的网络通讯
- 第二十六讲 使用ASP.NET实现网络通讯
- JAVA编程实现UDP网络通讯的方法示例
- 用WINSOCK API实现同步非阻塞方式的网络通讯
- Adaline神经网络简单介绍和MATLAB简单实现
- KVM虚拟化的四种简单网络模型介绍及实现(一)
- C#实现基于TCP协议的网络通讯。
- 反向传播神经网络(BP网络)介绍及Java实现
- TCP/IP协议、socket及socket简单实现网络通讯
- NIO Framework 助你简单实现 Java 的异步网络通讯
- 【工业串口和网络软件通讯平台(SuperIO)教程】九.重写通讯接口函数,实现特殊通讯方式
- Windows Sockets API实现网络异步通讯
- 用C#实现基于TCP协议的网络通讯
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--类设计2[使用IE浏览本页]
- TensorFlow入门,基本介绍,基本概念,计算图,pip安装,helloworld示例,实现简单的神经网络
- 用C#实现基于TCP协议的网络通讯