加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2dx的局域网通信实现----socket函数集初识

发布时间:2020-12-14 20:20:32 所属栏目:百科 来源:网络整理
导读:学习网络通信的第一步是要弄清楚网络通信的模型。首先要对tcp/ip协议模型有个最基本的理解。 然后接着就需要了解一些函数的基本用法和使用方法,比较坑爹的地方是,网络通信的相关的函数都是很多参数,而且很难理解它的作用。 以下是总结的一些网络通信函数

学习网络通信的第一步是要弄清楚网络通信的模型。首先要对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。


以下是tcp通信正常函数调用流程。



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通信模型。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读