ACE_TAO 003
Posted islinyoubiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACE_TAO 003相关的知识,希望对你有一定的参考价值。
在ACEReactor_test中,winsock2编写的通讯一直报错,所以我从网上找一个winsock2的例子,也在QtCreator中编译运行,是可以的,代码如下:
#include <QCoreApplication>
#include <QDebug>
#include <winsock2.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//1,Winsock初始化和结束
//每一个winsock应用程序必须首先加载相应的winsock dll版本。方法是调用:
//int WSAStartup(
//
// WORD wVersionRequested, 库版本,高字节副版本,低字节主版本
// LPWSADATA lpWSAData 结构指针,函数自动填充该结构。
//
//); 函数调用成功返回0
//可以用宏MAKEWORD(x, y)用来指定第一个参数的值
WSADATA wsadata;
WSAStartup(0x202, &wsadata);
//2,建立套接字
//套接字是传输提供者的一个句柄。
//SOCKET socket (
// int af,
// int type,
// int protocol IPPROTO_TCP, IPPROTO_UDP, 0(如果不想指定)
//);
//第一个参数指定通信协议的协议族,AF_INET(IPv4)或 AF_INET6(IPv6)(因为Socket是网络编程接口而不是一个协议,它使用流行的网络协议(TCP/IP,IPX)为应用程序提供的一个编程接口。)
//第二个参数指定要创建的套接字的类型。SOCK_STREAM(TCP流套接字), SOCK_ DGRAM(UDP数据包套接字),SOCK_RAW(原始套接字)
//第三个参数指定应用程序所指定应用程序所使用的通信协议。
//函数成功返回套接字描述符,失败返回INVALID_SOCKET
SOCKET sockt = socket(AF_INET, SOCK_STREAM, 0);
//struct sockaddr_in {
// short sin_family; //sin_family是通信协议族,
// u_short sin_port; //指明端口号
// struct in_addr sin_addr; //结构中有一个字段s_addr,表示IP地址,该字段是一个整数
// char sin_zero[8]; //sin_zero[8]为填充,使两个结构大小相同。
//};
struct sockaddr_in serv_addr;
memset(&serv_addr, 0x00, sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(21); //如果指定为htonl(INADDR_ANY),那么无论哪个网段上的客户机都能与该服务器通信,否则,只有与指定IP地址处于同一网段上的客户机能与该服务器通信。
//3,配置套接字
//当创建一个套接字后,再进行网络通信之前,必须先配置Socket。面向连接的客户端Socket通过调用connect函数在Socket数据结构中保存地址和远端信息。无连接客户端,服务端以及面向连接Socket的服务端,通过调用bind函数来配置本地信息。
//int bind(
// SOCKET s, 创建的套接字
// const struct sockaddr FAR* name, 指向地址缓冲区的指针
// int namelen 地址缓冲区的大小
//);
//成功返回0,失败返回SOCKET_ERROR
//当创建一个套接字后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。
//第二个参数指定一个sockaddr结构定义如下:
//struct sockaddr {
// u_short sa_family;
// char sa_data[14];
//};
int rc = 0;
rc = ::connect(sockt, (struct sockaddr*)&serv_addr, sizeof(struct sockaddr_in));
//有一些细节学要说明:
//在计算机把IP地址和端口号指定成多字节时,这个数是按“主机字节”(host-byte)顺序表示的,
//不同的处理器对数的表示方法有“大头”(big-endian——最有意义的字节到最无意义的字节)和“小头”(little-endian)两种形式。
//但是如果在网络上指定IP地址和端口号时,必须按照big-endian 的形式,一般称之为“网络字节”(network-byte)顺序。
if (rc < 0)
{
qDebug() << "error";
}
else
{
qDebug() << "success";
}
return a.exec();
}
打开网络小助手,新建一个服务器,监听:
运行程序:
所以,QtCreator用的unicode和winsock2没有太多影响。
下一步是找到ace wsa的报警是从哪来的。
多谢,亲爱的美美。
以上是关于ACE_TAO 003的主要内容,如果未能解决你的问题,请参考以下文章
ACE_TAO 017 ACE_wrappersexamplesReactor
ACE_TAO 017 ACE_wrappersexamplesReactor
ACE_TAO 017 ACE_wrappersexamplesReactor