/* This code is based heavily on the example provided in "Secure Programming * Cookbook for C and C++". */ int _mosquitto_verify_certificate_hostname(X509 *cert, const char *hostname) { int i; char name[256]; X509_NAME *subj; bool have_san_dns = false; STACK_OF(GENERAL_NAME) *san; const GENERAL_NAME *nval; const unsigned char *data; unsigned char ipv6_addr[16]; unsigned char ipv4_addr[4]; int ipv6_ok; int ipv4_ok; #ifdef WIN32 ipv6_ok = InetPton(AF_INET6, hostname, &ipv6_addr); ipv4_ok = InetPton(AF_INET, hostname, &ipv4_addr); #else ipv6_ok = inet_pton(AF_INET6, hostname, &ipv6_addr); ipv4_ok = inet_pton(AF_INET, hostname, &ipv4_addr); #endif san = X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL); if(san){ for(i=0; i<sk_GENERAL_NAME_num(san); i++){ nval = sk_GENERAL_NAME_value(san, i); if(nval->type == GEN_DNS){ data = ASN1_STRING_data(nval->d.dNSName); if(data && match_hostname((char *)data, hostname)){ return 1; } have_san_dns = true; }else if(nval->type == GEN_IPADD){ data = ASN1_STRING_data(nval->d.iPAddress); if(nval->d.iPAddress->length == 4 && ipv4_ok){ if(!memcmp(ipv4_addr, data, 4)){ return 1; } }else if(nval->d.iPAddress->length == 16 && ipv6_ok){ if(!memcmp(ipv6_addr, data, 16)){ return 1; } } } } if(have_san_dns){ /* Only check CN if subjectAltName DNS entry does not exist. */ return 0; } } subj = X509_get_subject_name(cert); if(X509_NAME_get_text_by_NID(subj, NID_commonName, name, sizeof(name)) > 0){ name[sizeof(name) - 1] = '\0'; if (!strcasecmp(name, hostname)) return 1; } return 0; }
bool Bind(ConnectionWrapper *Connection, std::string LocalAddress, int32_t Port) { #ifdef _WIN32 InitializeWinsock(); #endif if (Port < 0) return false; // Create a new socket. if (Connection->Handle.Datagram.Socket == nullptr) Connection->Handle.Datagram.Socket = (void *)socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (Connection->Handle.Datagram.Socket == nullptr) return false; // Prepare an address structure. sockaddr_in AddressInfo; AddressInfo.sin_family = AF_INET; AddressInfo.sin_port = htons(Port); if (LocalAddress.size() > 1) InetPton(AF_INET, LocalAddress.c_str(), &AddressInfo.sin_addr); else AddressInfo.sin_addr.S_un.S_addr = INADDR_ANY; // Bind to the port. return bind((SOCKET)Connection->Handle.Datagram.Socket, (sockaddr *)&AddressInfo, sizeof(AddressInfo)) != SOCKET_ERROR; }
Void System::StringToNetAddress( NetAddress * outAddress, const GChar * strDottedFormat, NetAddressType iType ) const { switch( iType ) { case NETADDRESS_IPv4: { NetAddressIPv4 * pAddr = (NetAddressIPv4*)outAddress; const GChar * strPort = StringFn->Find( strDottedFormat, TEXT(':') ); DebugAssert( strPort != NULL ); GChar strAddr[16]; StringFn->NCopy( strAddr, strDottedFormat, (strPort - strDottedFormat) ); ++strPort; in_addr ipAddr; Int iError = InetPton( AF_INET, strAddr, &ipAddr ); DebugAssert( iError == 0 ); Word wPort = (Word)( StringFn->ToUInt(strPort) ); pAddr->iType = NETADDRESS_IPv4; pAddr->wPort = htons( wPort ); pAddr->Addr.Value = ipAddr.S_un.S_addr; } break; case NETADDRESS_IPv6: { DebugAssert( false ); } break; default: DebugAssert( false ); break; } }
int main(void) { WSADATA w ; struct sockaddr_in si_other; int s, slen = sizeof(si_other); unsigned char data[BUFLEN]; /* Open windows connection */ if (WSAStartup(MAKEWORD(2, 2), &w) != 0) { fprintf(stderr, "could not initialise winsock\n"); exit(0); } // create a udp socket if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) { die("socket create error"); } // setup the target port/address memset((char *)&si_other, 0, sizeof(si_other)); si_other.sin_family = AF_INET; si_other.sin_port = htons(PORT); // convert IP address string to numerical if (1 != InetPton(AF_INET, LIGHTS, &si_other.sin_addr)) { die("InetPton failed"); } printf("press space to stop\n"); // wait for a key press while (!_kbhit()) { // fill the buffer with a simple blue fade for (int i = 0; i < BUFLEN; i+=3) { data[i ] = 0; // red data[i+1] = 0; // green data[i+2] = i>>1; // blue } // send to ESP if (sendto(s, (const char*)data, BUFLEN, MSG_DONTROUTE, (struct sockaddr *) &si_other, slen) == -1) { die("couldn't sendto"); } } //get rid of keypress (fflush) _getch(); closesocket(s); WSACleanup(); return 0; }
HERRCODE ChatClient::loginImpl(int type, const std::wstring& username, const std::wstring& credential) { sockaddr_in addr = { 0 }; addr.sin_port = htons(serverPort_); addr.sin_family = AF_INET; IN_ADDR in_addr; InetPton(AF_INET, serverAddr_.c_str(), &in_addr); addr.sin_addr = in_addr; if (::connect(sock_, (const sockaddr*)&addr, sizeof(sockaddr_in)) != 0) { return H_NETWORK_ERROR; } SockStream stream; stream.writeInt(net::kCommandType_Login); stream.writeInt(0); stream.writeInt(type); stream.writeString(username); stream.writeString(credential); stream.flushSize(); auto ret = ::send(sock_, stream.getBuf(), stream.getSize(), 0); if (ret == SOCKET_ERROR) { return H_NETWORK_ERROR; } buffer buf(200); int rc = ::recv(sock_, buf.data(), buf.size(), 0); if (rc) { SockStream ss(buf.data(), rc); assert(net::kCommandType_LoginAck == ss.getInt()); auto size = ss.getInt(); auto ack = ss.getInt(); if (ack == net::kLoginAck_Succeeded) { email_ = username; authKey_ = ss.getString(); auto hr = initSocks(sock_); if (hr != H_OK) return hr; return H_OK; } else { return H_AUTH_FAILED; } } else { return H_NETWORK_ERROR; } }
bool Listen(ConnectionWrapper *Connection, std::string LocalAddress, int32_t Port) { // Streamed socket listener. if (Connection->Type == eConnection::STREAMED) { // Prepare an address structure. sockaddr_in AddressInfo; AddressInfo.sin_family = AF_INET; AddressInfo.sin_port = htons(Port); InetPton(AF_INET, LocalAddress.c_str(), &AddressInfo.sin_addr); // Bind to the address. if (bind((SOCKET)Connection->Handle.Streamed.Socket, (sockaddr *)&AddressInfo, sizeof(AddressInfo)) == SOCKET_ERROR) return false; // Start to listen. if (listen((SOCKET)Connection->Handle.Streamed.Socket, SOMAXCONN) == SOCKET_ERROR) return false; return true; } return false; }
double tcp_connect_overhead(bool bLoopback = 0) { //remote tcp by default WORD wVersionRequested; WSADATA wsaData; int err; // Uses the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { #ifdef _DEBUG printf("WSAStartup failed with error: %d\n", err); #endif return 1; } LPCTSTR targetAddr; struct sockaddr_in sockaddr; sockaddr.sin_family = AF_INET; sockaddr.sin_port = htons(TCP_PORT); if (bLoopback) targetAddr = TEXT(LOOPBACK_IP_ADDR); else targetAddr = TEXT(REMOTE_IP_ADDR); int success = InetPton(AF_INET, targetAddr, &sockaddr.sin_addr); if (!success) { #ifdef _DEBUG printf("Error with InetPton\n"); #endif return -1; } __int64 iTotalTimeElapsed = 0; for (int i = 0; i < NUM_CONNECTS; i++) { SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == INVALID_SOCKET) { #ifdef _DEBUG printf("Error with socket\n"); #endif return -1; } QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&start_time_stamp); if (connect(sock, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == -1) { #ifdef _DEBUG printf("Error with connect\n"); printf("connect returned error: %ld\n", WSAGetLastError()); #endif return -1; } else { //successfully connected #ifdef _DEBUG printf("Success %d\n", i); #endif } closesocket(sock); QueryPerformanceCounter(&end_time_stamp); iTotalTimeElapsed += time_elapsed(); } WSACleanup(); printf("total time: %I64u ms\n", iTotalTimeElapsed); double dtotalTime = static_cast<double>(iTotalTimeElapsed); return dtotalTime / NUM_CONNECTS; }
/* Cliente Aplicacao simples de cliente tcp que se conecta num IP e PORTA passados por parametro, envia um comando ao servidor e escreve na saida padrao o retorno */ int main(int argc, char **argv) { // Declaracao de variaveis int sockfd; char buf[MAXDATASIZE + 1], error[MAXDATASIZE + 1]; char server[MAXDATASIZE + 1], server_reply[MAXDATASIZE + 1]; struct sockaddr_in servaddr; // Checa a presenca do parametro de IP e Porta // caso ausente, fecha o programa if (argc != 3) { strcpy(error,"uso: "); strcat(error,argv[0]); strcat(error," <IPaddress> <Port>"); perror(error); exit(1); } // Cria um socket sockfd = Socket(AF_INET, SOCK_STREAM, 0); // Limpa o que estiver no ponteiro do socket que representa o servidor // Seta o socket do servidor como IPv4 e seta a porta de conexao para a porta da aplicacao. bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(atoi(argv[2])); // Converte o IP recebido na entrada para a forma binária da struct InetPton(AF_INET, argv[1], servaddr); // Conecta o socket local com o socket servidor Connect(sockfd, servaddr); // Escrever IP e porta do servidor na saida padrao printf("Server: IP %s - Port %d\n", argv[1], atoi(argv[2])); // Coletar informacoes sobre o socket com o servidor servaddr = Getsockname(sockfd, servaddr); // Converter informacao do IP de binario para string // armazenar o resultado no buffer InetNtop(AF_INET, server, servaddr); // Escrever IP e porta do cliente no socket na saida padrao printf("Client: IP %s - Port %d\n", server, ntohs(servaddr.sin_port)); // lê uma cadeia de caracteres do teclado printf("Digite um comando:\n"); fgets(buf, MAXDATASIZE, stdin); // Imprime a linha de comando digitada pelo usuario printf("Linha de comando digitada: %s", buf); // envia os dados lidos ao servidor Write(sockfd , buf); // le os dados enviados pelo servidor Read(sockfd, server_reply); // Imprime a linha de comando devolvida pelo servidor printf("Linha de comando recebida: %s\n", server_reply); exit(0); }
int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsaData; int result; system("pause"); result = WSAStartup(MAKEWORD(2, 2), &wsaData); if(0 != result) { _tprintf(_T("WSAStartup error, code: %d"), WSAGetLastError()); exit(0); } SOCKET socketForProbe = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(INVALID_SOCKET == socketForProbe) { _tprintf(_T("socket error, code: %d"), WSAGetLastError()); exit(0); } sockaddr_in sockaddrClient; memset(&sockaddrClient, 0x0, sizeof(sockaddr_in)); sockaddrClient.sin_addr.s_addr = htonl(INADDR_ANY); sockaddrClient.sin_family = AF_INET; sockaddrClient.sin_port = htons(0); sockaddr_in sockaddrMulticastAddrForOnvif; memset(&sockaddrMulticastAddrForOnvif, 0x0, sizeof(sockaddr_in)); InetPton(AF_INET, _T("239.255.255.250"), &sockaddrMulticastAddrForOnvif.sin_addr.s_addr); sockaddrMulticastAddrForOnvif.sin_family = AF_INET; sockaddrMulticastAddrForOnvif.sin_port = htons(3702); result = bind(socketForProbe, (struct sockaddr*)&sockaddrClient, sizeof(sockaddr_in)); if(0 != result) { _tprintf(_T("bind error, code: %d"), WSAGetLastError()); exit(0); } DWORD timeOut = 5000; result = setsockopt(socketForProbe, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeOut, sizeof(DWORD)); if(0 != result) { _tprintf(_T("setsockopt error, code: %d"), WSAGetLastError()); exit(0); } char* pProbeMessage = (char*)malloc(2048); if(NULL == pProbeMessage) { _tprintf(_T("malloc error")); exit(0); } receiveThreadParameter parameter; BOOL loop = TRUE; DWORD threadID; parameter.socketForProbe = &socketForProbe; parameter.bLoop = &loop; UUID uuid; RPC_STATUS rpcStatus = UuidCreate(&uuid); if(RPC_S_OK != rpcStatus) { _tprintf(_T("UuidCreate error, code: %d"), WSAGetLastError()); exit(0); } RPC_CSTR RpcCstr; rpcStatus = UuidToStringA(&uuid, &RpcCstr); if(RPC_S_OK != rpcStatus) { _tprintf(_T("UuidCreate error, code: %d"), WSAGetLastError()); exit(0); } result = _snprintf_s(pProbeMessage, 2048, _TRUNCATE, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:SOAP-ENC=\"http://www.w3.org/2003/05/soap-encoding\" xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\" xmlns:wsdd=\"http://schemas.xmlsoap.org/ws/2005/04/discovery\"><SOAP-ENV:Header><wsa:MessageID>urn:uuid:%s</wsa:MessageID><wsa:To SOAP-ENV:mustUnderstand=\"true\">urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To><wsa:Action SOAP-ENV:mustUnderstand=\"true\">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action></SOAP-ENV:Header><SOAP-ENV:Body><wsdd:Probe></wsdd:Probe></SOAP-ENV:Body></SOAP-ENV:Envelope>", RpcCstr); if(-1 == result) { _tprintf(_T("_snprintf_s error")); exit(0); } rpcStatus = RpcStringFreeA(&RpcCstr); if(RPC_S_OK != rpcStatus) { _tprintf(_T("UuidCreate error, code: %d"), WSAGetLastError()); exit(0); } //result = _snprintf_s(pProbeMessage, 2048, _TRUNCATE, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:SOAP-ENC=\"http://www.w3.org/2003/05/soap-encoding\" xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\" xmlns:wsdd=\"http://schemas.xmlsoap.org/ws/2005/04/discovery\"><SOAP-ENV:Header><wsa:MessageID>urn:uuid:bc9fb550-1dd1-11b2-807c-c056e3fb5481</wsa:MessageID><wsa:To SOAP-ENV:mustUnderstand=\"true\">urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To><wsa:Action SOAP-ENV:mustUnderstand=\"true\">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action></SOAP-ENV:Header><SOAP-ENV:Body><wsdd:Probe><wsdd:Types>Device</wsdd:Types><wsdd:Scopes></wsdd:Scopes></wsdd:Probe></SOAP-ENV:Body></SOAP-ENV:Envelope>"); //if(-1 == result) //{ // _tprintf(_T("_snprintf_s error")); // exit(0); //} HANDLE hThread = CreateThread(NULL, 0, receiveThread, ¶meter, 0, &threadID); if(NULL == hThread) { _tprintf(_T("CreateThread error, code: %d"), GetLastError()); exit(0); } result = sendto(socketForProbe, pProbeMessage, result, 0, (sockaddr*)&sockaddrMulticastAddrForOnvif, sizeof(sockaddr_in)); if(SOCKET_ERROR == result) { _tprintf(_T("sendto error, code: %d"), WSAGetLastError()); exit(0); } Sleep(5000); loop = FALSE; WaitForMultipleObjects(1, &hThread, TRUE, INFINITE); CloseHandle(hThread); free(pProbeMessage); pProbeMessage = NULL; result = closesocket(socketForProbe); if(0 != result) { _tprintf(_T("closesocket error, code: %d"), WSAGetLastError()); exit(0); } result = WSACleanup(); if(0 != result) { _tprintf(_T("WSACleanup error, code: %d"), WSAGetLastError()); exit(0); } system("pause"); return 0; }