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

[新增EA003考勤系统演示片段]全程字幕-22套UML+Enterprise Architect建模示范视频

ACE_TAO 007

ACE_TAO 007 客户端重连