TCPSocket
来源:互联网 发布:安卓淘宝引流量软件 编辑:程序博客网 时间:2024/06/07 16:11
先来张大图
Socket是什么?Socket的基本操作?
* socket()函数* bind()函数* listen()、connect()函数* accept()函数* read()、write()函数等* close()函数
来一波实例
Socket:一种利用唯一标识(ip+端口)来进行通讯(数据交互)的方法。
Socket的基本操作:
socket中TCP的三次握手建立连接详解
tcp建立连接要进行“三次握手”,即交换三个分组。大致流程如下:
* 客户端向服务器发送一个SYN J* 服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1* 客户端再想服务器发一个确认ACK K+1
从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。
下面对函数进行解析:
int socket(int domain, int type, int protocol);
socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续 的操作都有用到它,把它作为参数,通过它来进行一些读写操作。
domain:即协议域。 常用的协议族有,AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。
type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。
protocol:指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 当我们调用socket创建一个socket时,返回的socket描述字它存在于协议族(address family,AF_XXX)空间中,但没有一个具体的地址。如果想要给它赋值一个地址,就必须调用bind()函数,否则就当调用connect()、listen()时系统会自动随机分配一个端口。 通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。 sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识一个socket。bind()函数就是将给这个描述字绑定一个名字。 addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。 addrlen:对应的是地址的长度 如果作为一个服务器,在调用socket()、bind()之后就会调用listen()来监听这个socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。 int listen(int sockfd, int backlog); int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); listen函数的第一个参数即为要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。 connect函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。 TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。TCP客户端依次调用socket()、connect()之后就想TCP服务器发送了一个连接请求。TCP服务器监听到这个请求之后,就会调用accept()函数取接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); accept函数的第一个参数为服务器的socket描述字,第二个参数为指向struct sockaddr *的指针,用于返回客户端的协议地址,第三个参数为协议地址的长度。如果accpet成功,那么其返回值是由内核自动生成的一个全新的描述字,代表与返回客户的TCP连接。
万事具备只欠东风,至此服务器与客户已经建立好连接了。可以调用网络I/O进行读写操作了,即实现了网咯中不同进程之间的通信!网络I/O操作有下面几组:
* read()/write()* recv()/send()* readv()/writev()* recvmsg()/sendmsg()* recvfrom()/sendto()
在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。
#include <unistd.h> int close(int fd);
参考http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html
- Tcpsocket
- TCPSocket
- TCPSocket编程
- Qt的TCPsocket通信
- Php TcpSocket还是UnixSocket?
- iOS TCPSocket讲解
- QT4 TcpSocket bind问题
- Linux--TCPsocket传输图片
- QT4.4 TcpSocket例程Debug
- Php-fpm TcpSocket vs UnixSocket
- QTcpServer多个TcpSocket连接
- java TCPSocket编程 简单示例
- java TCPSocket聊天小程序
- QT TcpSocket 传送结构体
- java TcpSocket编程小例子
- Linux C下TCPsocket编程
- QT tcpsocket 发送/接收数据
- TcpSocket发送延时,Nagle算法
- ## centos实现https ##
- Python学习——Class类
- CCF认证2017-9 除法
- 重启了Linux ,然后 启动MySQL 出现 Starting MySQL….. ERROR! The server quit without updating PID file
- redis客户端与服务端连接
- TCPSocket
- 深入了解Java爬虫的运用技术
- 安装ubuntu16.04.3单系统-开机显示no boot devices found
- Java(4-2)
- Java web连数据库的案例
- ARC 074
- Linux Unit9
- 2_intellij idea创建第一个maven项目
- 请帮助投票