Important: |
---|
This is retired content. This content is outdated and is no longer being maintained. It is provided as a courtesy for individuals who are still using these technologies. This content may contain URLs that were valid when originally published, but now link to sites or pages that no longer exist. |
The basic procedure for using IrSock is similar to that for Winsock. IrSock uses only the stream socket connection-oriented communication method.
-
Open a stream socket with socket (Windows Sockets), as with the server application. Use AF_IRDA for the address format parameter, SOCK_STREAM for the type and NULL for the protocol parameter
-
Search for the available devices, and retrieve its address with getsockopt (Windows Sockets). For more information, see Discovering Devices Using IrSock.
-
Connect to the server with the connect function using SOCKADDR_IRDAfor the name parameter.
-
-
Close the socket with closesocket.
For information about creating a server application, see IrSock Server Application
The following code sample shows how an IrSock client opens a socket and makes five attempts to locate a server. If no server is found, the client displays a dialog box to inform the user of the failure. When a server is detected, the client queries the server for its device identifier and sends a greeting to the service named My Server. It then waits for the server to respond, displays a message box with the response, and closes the socket.
Copy Code | |
---|---|
#include <windows.h> #include <af_irda.h> #define NUMRETYR 5 // Maximum number of retries int WINAPI WinMain ( HINSTANCE hInstance, // Handle to the current instance HINSTANCE hPrevInstance,// Handle to the previous instance LPTSTR lpCmdLine, // Pointer to the command line int nCmdShow) // Show window state. { SOCKET sock; // Socket bound to the server DEVICELIST devList; // Device list SOCKADDR_IRDA address = {AF_IRDA, 0, 0, 0, 0, "IRServer"}; // Specifies the server socket address int iCount = 0, // Number of retries index = 0, // Integer index iReturn, // Return value of recv function iDevListLen = sizeof (devList); // Size of the device list char szClientA[100]; // ASCII string TCHAR szClientW[100]; // Unicode string TCHAR szError[100]; // Error message string // Create a socket that is bound to the server. if ((sock = socket (AF_IRDA, SOCK_STREAM, 0)) == INVALID_SOCKET) { wsprintf (szError, TEXT("Allocating socket failed. Error: %d"), WSAGetLastError ()); MessageBox (NULL, szError, TEXT("Error"), MB_OK); return FALSE; } // Initialize the number of devices to zero. devList.numDevice = 0; while ( (devList.numDevice == 0) && (iCount <= NUMRETYR)) { // Retrieve the socket option. if (getsockopt (sock, SOL_IRLMP, IRLMP_ENUMDEVICES, (char *)&devList, &iDevListLen) == SOCKET_ERROR) { wsprintf (szError, TEXT("Server could not be located, getsockopt") TEXT(" failed. Error: %d"), WSAGetLastError ()); MessageBox (NULL, szError, TEXT("Error"), MB_OK); closesocket (sock); return FALSE; } iCount++; // Wait one second before retrying. Sleep (1000); } if (iCount > NUMRETYR) { MessageBox (NULL, TEXT ("Server could not be located!"), TEXT ("Error"), MB_OK); closesocket (sock); return FALSE; } // Get the server socket address. for (index = 0; index <= 3; index++) { address.irdaDeviceID[index] = devList.Device[0].irdaDeviceID[index]; } // Establish a connection to the socket. if (connect (sock, (struct sockaddr *)&address, sizeof (SOCKADDR_IRDA)) == SOCKET_ERROR) { wsprintf (szError, TEXT("Connecting to the server failed. Error: %d"), WSAGetLastError ()); MessageBox (NULL, szError, TEXT("Error"), MB_OK); closesocket (sock); return FALSE; } // Send a string from the client socket to the server socket. if (send (sock, "To Server.", strlen ("To Server.") + 1, 0) == SOCKET_ERROR) { wsprintf (szError, TEXT("Sending data to the server failed. Error: %d"), WSAGetLastError ()); MessageBox (NULL, szError, TEXT("Error"), MB_OK); } // Receive data from the server socket. iReturn = recv (sock, szClientA, sizeof (szClientA), 0); // Check if there is any data received. If there is, display it. if (iReturn == SOCKET_ERROR) { wsprintf (szError, TEXT("No data is received, recv failed.") TEXT(" Error: %d"), WSAGetLastError ()); MessageBox (NULL, szError, TEXT("Client"), MB_OK); } else if (iReturn == 0) { MessageBox (NULL, TEXT("Finished receiving data"), TEXT("Client"), MB_OK); } else { // Convert the ASCII string to a Unicode string szServerA[99] = 0; MultiByteToWideChar(CP_ACP, 0, szServerA, -1, szServerW, sizeof(szServerW)/sizeof(szServerW[0])); // Display the string received from the server. MessageBox (NULL, szClientW, TEXT("Received From Server"), MB_OK); } // Close the socket. closesocket (sock); return 0; } |