引用
A network socket is an endpoint of an inter-process communication flow across a computer network. Today, most communication between computers is based on the Internet Protocol; therefore most network sockets are Internet sockets.
A socket API is an application programming interface (API), usually provided by the operating system, that allows application programs to control and use network sockets. Internet socket APIs are usually based on the Berkeley sockets standard.
A socket address is the combination of an IP address and a port number, much like one end of a telephone connection is the combination of a phone number and a particular extension. Based on this address, internet sockets deliver incoming data packets to the appropriate application process or thread.
inter-process communication的机制:
- 1、管道
- 2、先进先出(FIFO)
- 3、消息队列
- 4、信号量
- 5、共享内存
- 6、套接字(socket)?
Socket主要用于进程间通信(IPC)。
访问套接字也需要描述符。类似文件描述符一样。套接字描述符(sockfd)在Unix系统是用文件描述符实现的。
1、socket函数:
#include<sys/socket.h>
int socket(int domain, int type, int protocol)
domain即
AF(address family)套接字通信域
AF_INET IPv4 |
AF_INET6 IPv6 |
AF_UNIX UNIX域 |
AF-UNSPEC 未指定 |
type即:
SOCK_DGRAM 长度固定的,无连接的不可靠报文传递 |
SOCK_STREAM 有序、可靠、双向的面向连接字节流 |
SOCK_RAW IP协议的数据报接口 |
引用
Socket types
There are several Internet socket types available:
* Datagram sockets, also known as connectionless sockets, which use User Datagram Protocol (UDP)
* Stream sockets, also known as connection-oriented sockets, which use Transmission Control Protocol (TCP) or Stream Control Transmission Protocol (SCTP).
* Raw sockets (or Raw IP sockets), typically available in routers and other network equipment. Here the transport layer is bypassed, and the packet headers are made accessible to the application.
There are also non-Internet sockets, implemented over other transport protocols, such as Systems Network Architecture (SNA).[2] See also Unix domain sockets (UDS), for internal inter-process communication.
protocol:
- IPPROTO_TCP
- IPPROTO_UDP
- IPPROTO_SCTP
2、bind函数:
把一个本地协议地址赋予一个socket
服务器需要给客户端请求的socket绑定一个众所周知的address。
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t len);
3、connect函数(client)
#include <sys/socket.h>
int connection(int sockfd, const struct sockaddr *addr, socklen_t len);
第二个、第三个参数分别是指向socket地址结构的指针和该结构的大小。
如果是tcp socket的话conntct函数将激发tcp的三路握手过程。
4、listen函数
服务器调用listen来宣告可以接受连接请求
#include <sys/socket.h>
int listen(int sockfd, int backlog);
listen函数仅由TCP服务器调用,它做两件事情:
第一、当socket函数创建一个socket时,它被假设为一个主动套接字,也就是说它是一个将调用connect发起连接的客户套接字。listen函数把一个未连接的套接字转换成一个被动套接字,指示内核应接收该套接字的请求。
其次、本函数第二个参数规定了内核应该为相应套接字排队的最大连接个数。
5、accept函数
用于从已完成连接队列对头返回下一个已完成连接。
一旦服务器调用了listen,socket就能接收connect请求。
#include <sys/socket.h>
int accept(int socked, struct sockaddr * restrict addr, socklen_t * restrict len);
6、close函数
用来关闭套接字,并终止TCP连接。
#include <sys/socket.h>
int close(int sockfd);
7、传输和接收函数
a、send
#include <sys/socket.h>
asize_t send(int socked, const void *buf, size_t nbytes, int flags);
b、sendto
和send类似,区别在于sendto允许在无连接的socket上制定一个目标地址
#include <sys/socket.h>
asize_t sendto(int socked, const void *buf, size_t nbytes, int flags, const struct sockaddr *destaddr, socklen_t destlen);
c、sendmsg
#include <sys/socket.h>
asize_t sendmsg(int socked, const struct msghdr *msg, int flags);
d、recv
#include <sys/socket.h>
asize_t recv(int socked, const void *buf, size_t nbytes, int flags);
e、recvfrom 可以得到数据发送者的源地址
#include <sys/socket.h>
asize_t recvfrom(int socked, void *restrict buf, size_t len, int flags,struct sockaddr *restrict addr,socklen_t *restrict addrlen);
f、recvmsg为了将接收到的数据送入多个缓存区,或者想接收辅助数据可以使用recvmsg
#include <sys/socket.h>
asize_t recvmsg(int socked, const struct msghdr *msg, int flags);
8、socket选项
setsockopt
#include <sys/socket.h>
int setsockopt(int sockfd, int level, int option, const void *val, socklen_t len);
getsockopt
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int option, void *restrict val, socklen_t *restruct lenp);
others:
可以调用getsockname来发现绑定到一个套接字的地址:
#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr * restrict addr, socklen_t * restrict alenp);
通过调用getpeername来找到对方地址:
#include <sys/socket.h>
int getpeername(int sockfd, struct sockaddr * restrict addr, socklen_t * restrict alenp);
除了还会返回对方的地址外,两个函数一样。
套接字通信是双向的,可以采用函数shutdown来禁止套接字上的输入/输出
#include <sys/socket.h>
int shutdown(int sockfd, int how);
options:
- SHUT_WR
- SHUT_RD
- SHUT_RDWR
能够close套接字,为什么还使用shutdown呢?
理由:
首先,close只有在最后一个活动引用被关闭时才释放网络端点。这意味着如果复制一个socket(ex:dup)socket直到关闭了最后一个引用它文件描述符之后才会被释放。而shutdown允许使一个socket处于不活动状态,无论引用它的sockfd多少。
其次,有时只关闭socket双向传输中的一个方向会很方便。
引用
这个列表是一个Berkeley套接字API库提供的函数或者方法的概要:
* socket() 创建一个新的确定类型的套接字,类型用一个整型数值标识,并为它分配系统资源。
* bind() 一般用于服务器端,将一个套接字与一个套接字地址结构相关联,比如,一个指定的本地端口和IP地址。
* listen() 用于服务器端,使一个绑定的TCP套接字进入监听状态。
* connect() 用于客户端,为一个套接字分配一个自由的本地端口号。 如果是TCP套接字的话,它会试图获得一个新的TCP连接。
* accept() 用于服务器端。 它接受一个从远端客户端发出的创建一个新的TCP连接的接入请求,创建一个新的套接字,与该连接相应的套接字地址相关联。
* send()和recv(),或者write()和read(),或者recvfrom()和sendto(), 用于往/从远程套接字发送和接受数据。
* close() 用于系统释放分配给一个套接字的资源。 如果是TCP,连接会被中断。
* gethostbyname()和gethostbyaddr() 用于解析主机名和地址。
* select() 用于修整有如下情况的套接字列表: 准备读,准备写或者是有错误。
* poll() 用于检查套接字的状态。 套接字可以被测试,看是否可以写入、读取或是有错误。
* getsockopt() 用于查询指定的套接字一个特定的套接字选项的当前值。
* setsockopt() 用于为指定的套接字设定一个特定的套接字选项
参考资料:
http://en.wikipedia.org/wiki/Network_socket
http://en.wikipedia.org/wiki/Inter-process_communication
http://zh.wikipedia.org/wiki/Berkeley%E5%A5%97%E6%8E%A5%E5%AD%97
分享到:
相关推荐
[Perl文]IO::Socket简介 ''''''''''''''''''' new()方法: SOCKET对象变量=IO::Socket::INET->new(SOCKET变量值); 实例: $sock=IO::Socket::INET->new('192.168.1.2:23'); 讲解: 所有的PERL对象编程都把对象...
### Web Socket简介及应用 #### 一、WebSocket概述 WebSocket是一种新型的通信协议,它作为HTML5中的一个重要组成部分,为Web开发带来了革命性的变化。在介绍WebSocket之前,我们需要回顾一下Web开发的历史,尤其...
- 建立 Socket 连接涉及服务器监听、客户端请求和连接确认三个步骤,与 TCP 连接类似,但更底层,可自定义协议和处理方式。 4. **Socket 连接与 TCP 连接的对比**: - HTTP 是基于 Socket 实现的应用层协议,提供...
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些...
Socket,又称为“套接字”,是网络编程中的基本组件,允许两个运行在网络上的程序进行通信。在操作系统中,每一个Socket都有一个唯一标识,通常由(协议,本地地址,本地端口)三元组构成。Socket是基于客户/服务器...
SuperSocket简介** SuperSocket设计的目标是让开发者能够快速搭建网络应用,它支持自定义协议,可以轻松地处理各种业务逻辑。框架的核心组件包括SocketServer和SocketAppServer,前者用于处理基础的Socket通信,后...
一、Socket简介 Socket是网络通信的基础接口,它允许应用程序通过Internet进行通信。在C#中,System.Net.Sockets命名空间提供了Socket类,用于实现TCP和UDP协议。TCP(传输控制协议)提供面向连接的、可靠的数据传输...
一、HP-Socket简介 HP-Socket是一个C++编写的网络通信库,它提供了丰富的API接口,支持TCP、UDP等多种网络协议。该框架不仅具备多线程处理能力,还支持异步事件驱动模型,以实现高效的网络通信。其易源代码的特点...
#### 一、Socket简介 **Socket** 是一种网络通信方式,它允许两台计算机之间进行数据交换。在互联网世界里,Socket 的历史远远早于 Java 语言的诞生,但 Java 使得 Socket 的使用变得更加简单高效。本章节将详细...
1. **Lua Socket简介** Lua Socket是一个由Diego Nehab开发的开源库,其目标是为Lua提供一个易于使用的网络编程接口。它基于Lua的简洁语法,使得开发者可以快速地创建网络应用程序,如Web服务器、客户端、代理等。 ...
#### Socket简介 Socket是应用层与传输层之间的一个抽象层,用于实现网络应用程序之间的通信。它可以理解为两个应用程序之间的一个端到端的连接。在TCP/IP协议族中,Socket通常被用来实现客户端与服务器之间的通信...
2. **Socket简介**: Socket是操作系统提供的接口,它允许应用程序实现进程间的网络通信。Socket可以基于TCP(面向连接,可靠传输)或者UDP(无连接,尽力而为传输)。 **二、WPF中集成Socket** 在WPF项目中,我们...
**一、Socket简介** Socket,又称套接字,是网络通信的基本单元,它提供了进程间的通信能力,允许不同机器上的程序通过网络进行交互。Socket分为两种类型:流式套接字(Stream Sockets, TCP)和数据报套接字...
SuperSocket简介 SuperSocket旨在简化套接字服务器的开发流程,提供了一种面向对象的模型,允许开发者专注于业务逻辑,而不是底层的网络通信细节。它支持自定义协议,可以轻松处理多种网络协议,如HTTP、FTP、TCP...
一、SuperSocket简介 SuperSocket设计初衷是为了简化基于TCP/IP协议的网络通信开发,它提供了一套完整的解决方案,包括服务端和客户端的实现,使得开发者可以专注于业务逻辑,而无需关心底层通信细节。SuperSocket...
**Socket简介** Socket,又称套接字,是网络编程的基本接口,它为应用程序提供了网络通信的能力。Socket允许两个或多个设备通过TCP/IP协议进行数据传输。在iOS开发中,我们通常使用C语言风格的低级API(如CFStream)...
1. **Socket简介** - Socket起源于UNIX系统的4BSD版本,用于进程间的通信。在网络环境中,Socket成为了TCP/IP协议族的一部分,为开发网络应用程序提供了便利。 - Socket是一个通信端点,它包含了IP地址和端口号,...
1. **SuperSocket简介**:文档首先会介绍SuperSocket的基本概念,包括其设计理念、核心功能和优点,例如它的轻量级特性、强大的插件机制以及对多线程和异步操作的支持。 2. **安装与配置**:详细步骤指导如何在C#...