Platform SDK: Active Directory, ADSI, and Directory Services |
The following program locates the example Winsock service and connects to it.
/* ** Simple Winsock Client */ #include <winsock2.h> #include <stdio.h> #define BUFSIZE 3000 / {A9033BC1-ECA4-11cf-A054-00AA006C33ED} static GUID SVCID_EXAMPLE_SERVICE = { 0xa9033bc1, 0xeca4, 0x11cf, { 0xa0, 0x54, 0x0, 0xaa, 0x0, 0x6c, 0x33, 0xed } }; static WCHAR ServiceInstanceName[] = L"Example Service Instance"; static WCHAR wszClientMessage[] = L"The directory service."; HRESULT main(void) { //Data structures for initializing Winsock WSADATA wsData; WORD wVer = MAKEWORD(2,2); //Data structures for searching HANDLE hQ; WSAQUERYSET QuerySet; PWSAQUERYSET ResultSet; DWORD dwResultSize; WCHAR wBuffer[BUFSIZE]; //Data structures for setting up communications SOCKET s; //Miscellaneous variables INT status; DWORD iAddr; BOOL bConnected = FALSE; //Clear out the data structures ResultSet = (PWSAQUERYSET)wBuffer; memset(&QuerySet,0,sizeof(QuerySet)); memset(ResultSet,0,sizeof(*ResultSet)); //Begin: Init Winsock2 status = WSAStartup(wVer,&wsData); if (status != NO_ERROR) return -1; //Create the socket s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (s == INVALID_SOCKET) { printf("Failed to create socket: %d\n",WSAGetLastError()); WSACleanup(); return -1; } //Set up the search QuerySet.dwSize = sizeof(QuerySet); QuerySet.lpServiceClassId = &SVCID_EXAMPLE_SERVICE; QuerySet.dwNameSpace = NS_NTDS; QuerySet.lpszServiceInstanceName = ServiceInstanceName; printf("Client: querying the directory service for service instance...\n"); //Look up the service to use status = WSALookupServiceBegin(&QuerySet, LUP_RETURN_NAME | LUP_RETURN_ADDR | LUP_RETURN_TYPE, &hQ); if (status != NO_ERROR) { if (status == WSASERVICE_NOT_FOUND) { printf("The service was not found.\n"); } else { printf("Query failed with error %d\n",WSAGetLastError()); } WSACleanup(); return -1; } //Call LookupNext to collect an instance to use. Note that this //can be called in a loop until WSA_E_NO_MORE is returned to get //all the instances returned by the query. Try each instance //until one works. printf("Client: search successful. Trying to connect...\n"); dwResultSize = BUFSIZE; while (WSALookupServiceNext(hQ, 0, &dwResultSize, ResultSet) == NO_ERROR) { for (iAddr=0;iAddr<ResultSet->dwNumberOfCsAddrs;iAddr++) { if (connect(s, ResultSet->lpcsaBuffer[iAddr].RemoteAddr.lpSockaddr, sizeof(SOCKADDR)) == NO_ERROR) { bConnected = TRUE; break; } else { printf("Connection failed %d. Error was %d\n",iAddr,WSAGetLastError()); } } if (bConnected) break; } //Close out the search service found and connected to status = WSALookupServiceEnd(hQ); printf("Client: connected!\n"); //Send the service a message printf("Client: Sending message to service...\n"); status = send(s,(char *)wszClientMessage,sizeof(wszClientMessage),0); //Clean up WSACleanup(); printf("Client: Finis!\n"); return 0; }