学习网络通信的第一步是要弄清楚网络通信的模型。首先要对tcp/ip协议模型有个最基本的理解。
然后接着就需要了解一些函数的基本用法和使用方法,比较坑爹的地方是,网络通信的相关的函数都是很多参数,而且很难理解它的作用。
以下是总结的一些网络通信函数的基本用法,网络通信大部分都是和这些函数打交道的。推荐本书《unix网络编程》。下面的解释就是参考的这本书。
1.socket函数
int socket(int family,int type,int protocol); 成功返回资源描述符(windows是socket,linux系列是int型)。 失败返回-1。
第一个参数:family 结构体定义解释 AF_INET ipv4协议 一般情况下都是这个参数。
第一个参数:type SOCK_STREAM tcp字节流,tcp协议使用。 SOCK_DGRAM数据报 udp使用。SOCK_RAW原始套接字(抓包)
第一个参数:protocol 制定协议 如果为0系统会自动根据前面设置推演。推荐填写0
返回的资源描述符也叫套接字,类似于fopen打开文件返回的FILE*结构体。是系统自动分配的。调用socket函数的时候,会向操作系统申请资源,成功会返回资源描述分配给程序,失败返回-1。不使用的时候一定要关闭这个资源描述符。也就是调用close(fd);如果不调用,系统就会等到进程退出的时候才回收。
2.bind函数
int bind(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen); 成功0 失败-1
绑定主机的一个ip地址和端口给资源描述符。也可以把ip设为INADDR_ANY一个值为0的宏。这样就会绑定主机的所有ip的某个端口给进程。port可设为0,系统自行选择端口。
2.connect函数 tcp客户端调用,用来连接服务端函数。
int connect(int sockfd,socklen_t addrlen);
sockfd是socket函数返回的资源描述符
servaddr服务端地址标识 sockaddr结构体 后面具体说明
addrlen地址长度 一般是sizeof(servaddr);
返回值为ETIMEDOUT。等待75秒后仍未收到响应则返回此错误
返回为ECONNREFUSED 服务器主机在我们制定的端口上没有进程在等待与之链接。能找到ip。(硬错)
返回EHOSTUNREACH或ENETUNREACH 目的地址不可达
4.listen函数 tcp服务器调用函数。只是设置可以接收的连接最大数。并不是真正的监听
int listen(int sockfd,int backlog) 成功0 失败-1
sockfd 资源描述符 backlog 此套接字最大链接个数 正在链接+等待链接队列
5.int accept(int sockfd,struct sockaddr *servaddr,socklen_t *addrlen); 成功非负描述符 失败-1
参数servaddr和addrlen是用来接收连接服务器的客户端信息的。正确的用法是,
struct sockaddr_in server;
int len = 0;
int rv = 0;
bzero(&server,sizeof(server));
rv = accept(fd,(struct sockaddr *)&server,&len);
如果accept执行成功,则返回为客户端连接生成的全新描述符,代表于客户端的连接。
6.intsend(intsockfd,const char * buf,int buflen,int flags)用于向一个已经连接的socket发送数据,如果无错误,返回值为所发送数据的总数,否则返回-1。
7.int recv( int sockfd,char *buf,int flags); 用于从一个已经连接的socket接收数据,如果无错误,返回值为所发送数据的总数,否则返回-1。
recv()返回0表示客户端正常断开链接。
阻塞模式下,recv函数会等待直到接收到数据或者链接断开为止。非阻塞模式下,recv立即返回,如果有数据则返回值为数据长度,否则返回-1。
8.sendto(int sockfd,const void *buf,size_t buflen,int flags,const struct sockaddr *to,size_t addrlen)
9.recvfrom(int sockfd,const struct sockaddr *from,size_t *addrlen)
前三个参数都是一样的,建立的socket描述符,接收用的buf,发送用的buf,buf的长度。第四个参数填0.
最后两个函数,sendto是要发送的ip地址端口的和长度,recvfrom是获取接收数据的地址信息。可以传入空指针。
以下是udp通信模型。
原文链接:https://www.f2er.com/cocos2dx/344407.html