2016-11-20 14 views
0

in unserer Studie von Netzwerk-Programmierung begannen wir mit IRDA-Programmierung, so habe ich zwei IrDA-Adapter "Kingsun KS-959 USB Infrarot-Adapter" und zwei alte Computer mit Windows XP SP2.Wie stelle ich eine Verbindung über irDA-Buchsen her?

Ich habe die Adapter auf beiden Maschinen korrekt installiert.

Ich wollte Server/Client in IrDA erstellen. hier ist ein Beispiel für 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; 

und hier ist eine Probe 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()); 
    } 
} 

ich alles funktioniert erhalten, bis eine Verbindung so connect noch stecken Ausgabe und deshalb wird keine Verbindung hergestellt.

schätze ich jeden König von Hilfe

Antwort

1

In der Server-Implementierung, legen accept() in einer while(1) Schleife.

Sie müssen nicht in der while(1) Schleife für die connect() im Client Implementierung warten.

Server

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

aber akzeptieren eine blockierende API. und selbst dann ist das Problem das gleiche. trotzdem danke für deine Hilfe. – Lee5

+0

gibt es einen anderen Vorschlag? – Lee5

+0

Können Sie Infra Red-Verbindungen testen, die über OS funktionieren? Wenn zwei Systeme angeschlossen sind, können Sie auch testen, ob Sie Dateien über die IR-Verbindung übertragen können? –

Verwandte Themen