#pragma comment(lib, "ws2_32.lib") #include #include #include #include #include #include #include using namespace std; HANDLE hMutex; map clients; void test(void *arg) { char *mes = (char*)arg; WaitForSingleObject(hMutex, 10000); for(int i=0; i<10; i++) { puts(mes); Sleep(300); } ReleaseMutex(hMutex); } void sendThread(void *arg) { /////////////////// send ///////////////////// for(int id = 0;;id++) { cout << "id = " << id << endl; for(map::iterator i = clients.begin(); i != clients.end(); ++i) { } Sleep(5000); } } int main() { hMutex = CreateMutex(NULL, FALSE, NULL); WORD wVersionRequested = MAKEWORD(2, 2);; WSADATA wsaData; if(WSAStartup(wVersionRequested, &wsaData) != 0) { printf("Server: The Winsock dll not found!\n"); return -1; } else { printf("Server: The Winsock dll found!\n"); printf("Server: The status: %s.\n", wsaData.szSystemStatus); } if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2 ) { printf("Server: The dll do not support the Winsock version %u.%u!\n", LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion)); WSACleanup(); return -1; } else { printf("Server: The dll supports the Winsock version %u.%u!\n", LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion)); printf("Server: The highest version this dll can support: %u.%u\n", LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion)); } //////////Create a socket//////////////////////// SOCKET m_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (m_socket == INVALID_SOCKET) { printf("Server: Error at socket(): %ld\n", WSAGetLastError()); WSACleanup(); return -1; } else { printf("Server: socket() is OK!\n"); } ////////////////bind////////////////////////////// sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.s_addr = inet_addr("0.0.0.0"); service.sin_port = htons(1807); if (bind(m_socket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR) { printf("Server: bind() failed: %ld.\n", WSAGetLastError()); closesocket(m_socket); return -1; } else { printf("Server: bind() is OK!\n"); } ////////////////// online ///////////////////// SOCKET s_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s_socket == INVALID_SOCKET) { printf("Server: Error at socket(): %ld\n", WSAGetLastError()); WSACleanup(); return -1; } else { printf("Server: socket() is OK!\n"); } sockaddr_in s_service; s_service.sin_family = AF_INET; s_service.sin_addr.s_addr = inet_addr("255.255.255.255"); s_service.sin_port = htons(1807); char optval = 1; int optlen = sizeof(optval); setsockopt(s_socket, SOL_SOCKET, SO_BROADCAST, &optval, optlen); char message[] = "IBORN"; sendto(s_socket, message, strlen(message), 0, (const struct sockaddr *)&s_service, sizeof(s_service)); /////////////////// threads /////////////////// _beginthread(sendThread, 0, NULL); //////////////////// recieve ///////////////// const int buflen = 100500; char buf[buflen]; int mSocketLen = sizeof(service); for(;;) { int recvBytes = recvfrom(m_socket, buf, buflen, 0, (struct sockaddr *)&service, &mSocketLen); printf("recvBytes = %d\n", recvBytes); buf[recvBytes] = '\0'; puts(buf); printf("recieved from: %s:%d\n", inet_ntoa(service.sin_addr), service.sin_port); } return 0; }