c++ - 如何通过 irDA 套接字建立连接?

标签 c++ network-programming infrared

在学习网络编程时,我们从 irDA 编程开始,所以我有两个 irDA 适配器“Kingsun KS-959 USB 红外适配器”和两台运行 windows xp sp2 的旧计算机。

我在两台机器上都正确安装了适配器。

我想在 irDA 中创建服务器/客户端。这是 irServer irClient 的示例:

// irServer:

#define BACKLOG 2
WORD    wVersion = MAKEWORD(2, 2);
WSADATA wSaData;

if(WSAStartup(wVersion, &wSaData))
    return -1;

int irSockServ = socket(AF_IRDA, SOCK_STREAM, 0);

if(SOCKET_ERROR == irSockServ)
    DieWithError(WSAGetLastError());

SOCKADDR_IRDA sa_irda_serv = {AF_IRDA, 0, 0, 0, 0, 
                            "irDA:irCOMM"};
if(SOCKET_ERROR == bind(irSockServ, (SOCKADDR*)&sa_irda_serv, sizeof(sa_irda_serv)))
    DieWithError(WSAGetLastError());
if(SOCKET_ERROR == listen(irSockServ, BACKLOG))
    DieWithError(WSAGetLastError());

SOCKADDR_IRDA sa_irda_clnt;
int sa_irda_clnt_len = sizeof(sa_irda_clnt);
int irSockClnt = accept(irSockServ, (SOCKADDR*)&sa_irda_clnt, &sa_irda_clnt_len);

if(SOCKET_ERROR == irSockClnt)
    DieWithError(WSAGetLastError());
else
    cout << "Client! Connected" << std::endl;

这是 irClient 的示例:

WORD    wVersion = MAKEWORD(2, 2);
WSADATA wSaData;

if(WSAStartup(wVersion, &wSaData))
    return -1;

int irSockClnt = socket(AF_IRDA, SOCK_STREAM, 0);

if(SOCKET_ERROR == irSockClnt)
    DieWithError(WSAGetLastError());

DEVICELIST DevLst;
int DevLstLen = sizeof(DEVICELIST);

while(1)
{
    Sleep(1000);
    DevLst.numDevice = 0;

    // enumerating in range irDA devices
    if(SOCKET_ERROR == getsockopt(irSockClnt, SOL_IRLMP, 
        IRLMP_ENUMDEVICES, (char*)&DevLst, &DevLstLen))
        DieWithError(WSAGetLastError());
    if(DevLst.numDevice)
    {
        cout << "Device Name: " << DevLst.Device[0].irdaDeviceName << endl;

        SOCKADDR_IRDA sa_irda_serv;
        sa_irda_serv.irdaAddressFamily = AF_IRDA;
        strcpy(sa_irda_serv.irdaServiceName, "irDA:irCOMM");
        memcpy(&sa_irda_serv.irdaDeviceID[0], &DevLst.Device[0].irdaDeviceID[0], 4);

        // the problem is here it still stuck and won't connect!??
        if(SOCKET_ERROR == connect(irSockClnt, (SOCKADDR*)&sa_irda_serv, sizeof(sa_irda_serv)))
            DieWithError(WSAGetLastError());
    }
}

在发出连接之前,我的一切正常,所以 connect 仍然卡住,因此没有建立连接。

感谢各位大神的帮助

最佳答案

在服务器实现中,将accept() 放在while(1) 循环中。

您无需在while(1) 循环中等待client 实现中的connect()

服务器

while(1) {
...
 accept(...);
 Sleep(Number_of_miliseconds);//You are using win32 imp, for POSIX sleep() this will be in seconds
...
}

关于c++ - 如何通过 irDA 套接字建立连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40699546/

相关文章:

C++:头文件中全局函数的多重定义错误

c++ - 将 vector 传递给函数

java - 关于 InetAdress.getByName() 的困惑

network-programming - recvfrom 最大缓冲区 TCP/IP

python - 为什么我不能将 urllib2.urlopen 用于维基百科网站?

c++ - 验证码在Arduino中不起作用

c - 具有其他阻挡功能的Arduino IR Remote

c++ - cocos2dx 检测与多边形 Sprite 的交集

c++ - 将数据从 C++ 应用程序写入数据库

java - android 应用程序中的红外线实现导致它崩溃