1.面向连接的协议
在面向连接的协议中,两台计算机之间在进行数据收发前,必须先在两者之间建立一个通信通道
,以确保两台计算机之间存在一条路径可以相互沟通。在数据传输完毕之后,切断这条通信通道。该种方式相当于打电话。
面向连接的协议使用的是TCP协议,服务器与客户端建立通信信道所需要的基本Winsock函数如下:
服务器端函数:
socket()->bind->listen()->accept()->send()/recv()->closesocket()
客户端函数:
socket()->connet()->send()/recv()->closesocket()
2.非面向连接的协议
在非面向连接的协议中,发送端只要直接将要发送的数据传出即可,不需要理会接送方是否能够接收到数据。而接受端在接受数据时,也不会响应消息通知发送给发送端。该种方式相当于写信,将写好的信放到信箱中,但是却不能保证收信人真的能够收到这封信。
非面向连接使用的是UDP协议,服务器与客户端通信所需要的基本Winsock函数如下:
服务器端函数:
socket()->bind->sendto()/recvfrom()->closesocket()
客户端函数:
socket()->sendto()/recvfrom()->closesocket()
linux下的sock函数:
socket(domain,int type,int protocol)
用于创建一个新的套接字,返回一个表示套接字的文件描述符,错误时返回-1。connect(int fd,struct sockaddr *remove_host,socklen_t addr_length)
将一个套接字(有文件描述符fd指定)连接远程主机。成功返回0,错误返回-1。bind(int fd,struct sockaddr *local_addr,socklen_t addr_length)
将套接字绑定到一个本地地址,以便它可以侦听传入的连接。成功返回0,错误返回-1。listen(int fd,int backlog_queue_size)
侦听传入的连接并将连接请求排队,知道数量达到backlog_queue_size。成功返回0,错误返回-1。accept(int fd,sockaddr *remove_host,socklen_t *addr_length)
在一个绑定的端口接受一个传入的连接。远程主机的地址信息写入remote_host结构中,地址结构的实际大小写入到addr_length中。这个函数返回一个新的套接字文件描述符来标识已经连接的套接字,错误返回-1。
`send(int fd,void buffer,size_t n,int flags)从*buffer向套接字fd发送n个字节,返回值为发送的字节数,错误返回-1。
recv(int fd,void buffer,size_t n, int flags)`
从套接字fd接受n个字节到buffer中,返回值为发送的字节数,错误返回-1。