大佬教程收集整理的这篇文章主要介绍了Cocos2dx网络学习笔记(一),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
直接上代码,再一一解释用到的东西
#include <String>
#include <sys/types.h>
#include <sys/socket.h>
#include <neTinet/in.h>
#include <arpa/inet.h>
#include <iostream>
using namespace @H_489_28@std;
#define SOCKET int
#define ListenPort 9999
int main()
{
SOCKET st = socket( AF_INET,SOCK_STREAM,0 );
if ( st == -1 )
{
@H_489_28@cout << "create socket failed" << endl;
return 0;
}
struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons( ListenPort );
my_addr.sin_addr.s_addr = INADDR_ANY; /* inet_addr("127.0.0.1"); */
@H_489_28@memset( my_addr.sin_zero,0,8 );
int result = ::bind( st,(struct sockaddr *) (&my_addr),sizeof(struct sockaddr) );
if ( result == -1 )
{
@H_489_28@cout << "bind socket failed" << endl;
return 0;
}
result = listen( st,1 );
if ( result == -1 )
{
@H_489_28@cout << "listen socket failed" << endl;
return 0;
}
struct sockaddr_in new_addr;
socklen_t sin_size = sizeof(struct sockaddr_in);
SOCKET new_connect = accept( st,(struct sockaddr *) (&new_addr),&sin_size );
if ( new_connect != -1 )
{
char* ip = inet_ntoa( new_addr.sin_addr );
@H_489_28@cout << "new connect from " << ip << " with port:" << new_addr.sin_port << endl;
char buf[1024];
while ( true )
{
int recv_bytes = ::recv( new_connect,&buf,1024,0 );
if ( recv_bytes == -1 )
{
@H_489_28@cout << "recv failed" << endl;
break;
}
@H_489_28@cout << "receive from client:" << buf << endl;
@H_489_28@String message = buf;
message = "this is reply for " + message;
int reply_len = message.length();
int send_bytes = ::send( new_connect,message.c_str(),reply_len,0 );
if ( send_bytes == -1 )
{
@H_489_28@cout << "send failed" << endl;
break;
}
}
}
return 0;
}
首先是头文件:
#include <sys/types.h>
#include <sys/socket.h>
#include <neTinet/in.h>
#include <arpa/inet.h>
这几个基本是常用的,其他常用的网络头文件可以看这个 linux网络编程常用头文件,windows下是#include <winsock.h>
int socket(int domain,int type,int protocol);
创建一个socket,第一个和第三个参数分别是域和协议,一般直接用这个就好,第二个参数是使用哪种协议,SOCK_STREAM
是TCP,SOCK_DGRAM
是UDP的,返回值为-1表示创建失败
struct sockaddr_in
这个结构体是为了更方便的处理sockaddr
的,添加监听、连接服务器的相关配置都是这个结构体,两者可以强转,原型是
struct sockaddr_in {
short int sin_family; /* 通信类型,跟创建socket的第1个参数一致 */
unsigned short int sin_port; /* 端口 */
struct in_addr sin_addr; /* Internet 地址 struct in_addr { unsigned long s_addr; };*/
unsigned char sin_zero[8]; /* 与sockaddr结构的长度相同*/
};
因为网络和本机的字节顺序不一样,sin_port
需要通过htons
(host to network short)转换,ip地址也需要转换,不过可以使用专门的函数inet_addr("ip")
,特别的,INADDR_ANY
表示本机地址。sin_zero
需要用@H_144_182@memset或者bzero
清零。
int bind(int sockfd,struct sockaddr *my_addr,int addrlen);
sizeof(struct sockaddr)
。绑定失败(如端口占用等)返回值为-1。int listen(int sockfd,int BACklog);
int accept(int sockfd,void *addr,int *addrlen);
void *addr
可以获取新连接的参数,如IP,端口等。后两个参数跟bind类似。注意一点,获取到的参数信息是网络字节顺序,需要转换成本机自己顺序才可正确使用,ntohs
(network to host short)和inet_ntoa
。int recv(int sockfd,void *buf,int len,unsigned int flags);
int send(int sockfd,const void *R_751_11845@sg,int flags);
using namespace std;
的情况下要特别注意.telnet 127.0.0.1 9999
测试bind
、listen
和accept
都是服务器端用的函数,客户端用的就只需要一个connect
int connect(int sockfd,struct sockaddr *serv_addr,int addrlen);
创建socket完成后调用此函数,serv_addr是服务器的地址和端口。错误返回-1
示例代码:
#include <String>
#include <sys/types.h>
#include <sys/socket.h>
#include <neTinet/in.h>
#include <arpa/inet.h>
#include <iostream>
using namespace @H_489_28@std;
#define SOCKET int
#define ListenPort 9999
using namespace @H_489_28@std;
int main(int argc,char *argv[]) {
SOCKET st = socket( AF_INET,0 );
if ( st == -1 )
{
@H_489_28@cout << "create socket failed" << endl;
return 0;
}
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons( ListenPort );
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");;
@H_489_28@memset( server_addr.sin_zero,8 );
int result = connect(st,(struct sockaddr*)(&server_addr),sizeof(struct sockaddr));
if (result == -1)
{
@H_489_28@cout << "connect server failed" << endl;
return 0;
}
@H_489_28@String message;
while (true) {
@H_489_28@cin >> message;
@H_489_28@cout << "send to server:" << message << endl;
int reply_len = message.length();
int send_bytes = ::send( st,0 );
if ( send_bytes == -1 )
{
@H_489_28@cout << "send failed" << endl;
break;
}
char buf[1024];
int recv_bytes = ::recv( st,0 );
if ( recv_bytes == -1 )
{
@H_489_28@cout << "recv failed" << endl;
break;
}
@H_489_28@cout << "receive from server:" << buf << endl;
}
return 0;
}
服务器 + telnet
服务器 + 客户端
以上是大佬教程为你收集整理的Cocos2dx网络学习笔记(一)全部内容,希望文章能够帮你解决Cocos2dx网络学习笔记(一)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。