`

Socket简介

阅读更多
引用
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)

domainAF(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简介

    [Perl文]IO::Socket简介 ''''''''''''''''''' new()方法: SOCKET对象变量=IO::Socket::INET-&gt;new(SOCKET变量值); 实例: $sock=IO::Socket::INET-&gt;new('192.168.1.2:23'); 讲解: 所有的PERL对象编程都把对象...

    http和socket简介和对比

    http和socket简介和对比,有哪些区别,差异等等的。

    Web Socket简介

    Web Socket简介 关于WebSocket内容的简介以及相关的应用

    Socket简介及使用

    socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –&gt; 读写write/read –&gt; 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些...

    socket简介

    简介socket,对socket进行简要描述,对于初学者提供一些概念性的帮助

    Socket相关介绍

    WP7 网络通信技术概览 •Socket 简介 •Socket 适用场景 •Socket 对战平台 •Socket 相关术语介绍 •Socket 工作流程 •使用 Socket •Socket 开发实战

    socket编程简介

    有关socket的简介以及一些网络编程的基础知识,是我们老师给的ppt,拿来网上分享下。希望可以给更多的人解惑

    UNIX SOCKET编程简介

    讲述了 TCP 和 SOCKET 的工作原理、操作方式和函数应用

    TCPSocket编程.zip

    Socket简介 Windows Socket Linux Socket Socket常用函数介绍 TCP/IP网络程序框架与实例 通信方式 阻塞 非阻塞

    TCPSocket编程

    Socket简介 Windows Socket Linux Socket Socket常用函数介绍 TCP/IP网络程序框架与实例 通信方式 阻塞 非阻塞

    socket.io应用简介

    socket.io实时通讯入门讲解PPT,并有代码示例。

    .Net Socket编程资料

    (5)Socket使用简介;(6)同步套接字通信;(7)续实例解析SOCKET编程模型之异步通;(8)在C#中使用异步Socket编程实现TCP网络服务的CS的通讯构架;(9)重新研究socket传输自定义对象 9个doc帮助文档,已经两个Demo程序.请下载...

    UNIX SOCKET编程简介.doc

    UNIX SOCKET编程简介.doc

    UNIX-SOCKET编程简介.doc

    UNIX-SOCKET编程简介.doc

    Python 中的 Socket 编程

    简介 Python 中的 Socket 编程 说明 译者注 授权 开始 Socket API 概览 TCP Sockets 客户端 / 服务器echo 程序 echo 程序的服务端 echo 程序的客户端 运行echo 程序的客户端和服务端 查看 socket 状态 通信流程的...

    UNIX SOCKET编程简介38821new.doc

    UNIX SOCKET编程简介38821new.doc

    python网络编程

    ⼦⽹掩码 socket简介 udp介绍 udp⽹络程序-发送数据 udp⽹络程序-发送、接收数据 udp⽹络程序-端⼝问题 udp绑定信息 udp⽹络通信过程 udp应⽤:echo服务器 udp应⽤:聊天室 udp总结 udp综合作业-模拟QQ TFTP项⽬、...

Global site tag (gtag.js) - Google Analytics