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

7 篇文章 0 订阅
6 篇文章 0 订阅

学习网络通信的第一步是要弄清楚网络通信的模型。首先要对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,const struct sockaddr *servaddr,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.int send(int sockfd, const char * buf, int buflen, int flags)用于向一个已经连接的socket发送数据,如果无错误,返回值为所发送数据的总数,否则返回-1。


7.int recv( int sockfd,char *buf, int buflen,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 void *buf,size_t buflen,int flags,const struct sockaddr *from,size_t *addrlen)

前三个参数都是一样的,建立的socket描述符,接收用的buf,发送用的buf,buf的长度。第四个参数填0.

最后两个函数,sendto是要发送的ip地址端口的和长度,recvfrom是获取接收数据的地址信息。可以传入空指针。

以下是udp通信模型。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值