网络通信编程
网络通信socket
所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口
计算机是通过TCP/IP协议进行互联从而进行通信的,为将TCP/IP协议进行隐藏,引出套接字这个概念
套接字可以看成IP地址与端口号的组合
套接字提供了流套接字与数据报套接字两种组合
- 流套接字基于TCP(stream)
- 数据报套接字基于UDP(datagram)
网络通信的过程
C/S模式的交互过程如下所示
C++网络编程常用API
- 创建套接字:int socket(int family,int type,int protocol);
- 流程
在Windows环境下进行开发套接字系统
WinSock DLL
初始化WinSock DLL
int WSAStartup(
WORD wVersionRequested, //调用者能使用的Windows Socket支持的最高版本。高位指定副版本,低位指定主版本号
LPWSADATA lpWSAData //指向WSADATA的指针,用于接收Windows Socket的实现细节
);
//该函数在一个进程中初始化WS2_32.dll的使用
释放WinSock DLL资源
int WSACleanup(void);
socket相关函数
socket()函数
int socket(int domain, int type, int protocol);
socket()用于创建一个socket描述符,它标识socket。能用它作为参数。进行一些读写操作。
socket()函数有三个参数,分别为:
- domain:协议域,又称为协议族。
- type:指定socket类型
- protocol:协议
blind()函数
blind()函数把一个地址族中的特定地址赋给socket。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
blind()函数有三个参数,分别为:
- sockfd:socket描述字,它是通过socket()函数创建的,标识唯一一个socket
- addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同
- addrlen:对应的是地址的长度。
listen(),connect()函数
服务器在调用了socket()与blind()之后会调用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服务器的连接。
accept()函数
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
accept函数的第一个参数为服务器的socket描述字,第二个参数为指向struct sockaddr *的指针,用于返回客户端的协议地址,第三个参数为协议地址的长度。如果accpet成功,那么其返回值是由内核自动生成的一个全新的描述字,代表与返回客户的TCP连接。
send(),recv()函数
int send(
SOCKET s, //标识一个已经建立连接套接字的描述符
const char*buf, //包含待传输数据的缓冲区
int len, //buf中数据的长度
int flags
);
//send函数在一个已建立连接的套接字上发送数据
int recv(
SOCKET s, //标识一个已建立连接套接字的描述符
char*buf, //接收传来的数据的缓冲区
int len, //缓冲区长度
int flags
);