bool Pipe2Sock::OnStartup(int argc, const char*const* argv) { if (argc == 1) { TRACE("No args! Are you sure you want to be running without any args?\n"); Usage(); } if (!ProcessCommands(argc, argv)) { PLOG(PL_ERROR, "pipe2Sock::OnStartup() error processing command line\n"); Usage(); return false; } //set the destination address/port info dst_addr.SetPort(dst_port); TRACE("Destination address set to %s/%d\n",dst_addr.GetHostString(),dst_port); //set the socket sending/binding port info if(!(socket.Bind(snd_port))){ PLOG(PL_ERROR,"pipe2Sock::OnStartup() error binding to port %d\n",snd_port); return false; } if(!(socket.Open(snd_port,ProtoAddress::IPv4,false))) { PLOG(PL_ERROR,"pipe2Sock::OnStartup() error opening the socket on port %d\n",snd_port); return false; } if(dst_addr.IsMulticast()) { if(!socket.JoinGroup(dst_addr)) { PLOG(PL_ERROR,"pipe2Sock::OnStartup() error joining multicast group %s\n",dst_addr.GetHostString()); socket.Close(); return false; } TRACE("Joined multicast group %s\n",dst_addr.GetHostString()); } TRACE("Sending port set to %d\n",snd_port); //open up a listening pipe if (!listen_pipe.Listen(listen_pipe_name)) { socket.Close(); PLOG(PL_ERROR, "Pipe2Sock::OnCommand() listen_pipe.Listen() error opening pipe with name %s\n",listen_pipe_name); return false; } TRACE("pipe2Sock: listen \"%s\" listening ...\n", listen_pipe_name); return true; } // end Pipe2Sock::OnStartup()
/* * Class: javm_nativeimp_NsDatagramSocketImpl * Method: peek * Signature: (Ljavm/net/InetAddress;)I */ JNIEXPORT jint JNICALL Java_agentj_nativeimp_NsDatagramSocketImpl_peek (JNIEnv *env, jobject javaobj, jobject longAddress) { PLOG(PL_DEBUG, "Java_agentj_nativeimp_NsDatagramSocketImpl_peek: Entering\n"); ProtoSocket *socket = (ProtoSocket *)getSocket(env, javaobj); // gets the socket... int len=1; char *bdata = new char[len]; unsigned int actualRead=len; socket->Recv(bdata, actualRead); delete []bdata; char sendersAddress[5]; int sendersPort; ProtoAddress sendersProtoAddress = socket->GetDestination(); sendersPort = sendersProtoAddress.GetPort(); sendersProtoAddress.GetHostString(sendersAddress, strlen(sendersAddress)); jclass longClass = env->FindClass("java/lang/Long"); jmethodID setAddressID = env->GetMethodID(longClass, "<init>", "(J)V"); longAddress = env->NewObject(longClass, setAddressID, (jlong)sendersProtoAddress.SimGetAddress()); return 0; }
void Pipe2Sock::SendMessage() { if(socket.IsOpen()) { TRACE("Sending message %s to %s/%d\n",msg_buffer,dst_addr.GetHostString(),dst_addr.GetPort()); unsigned int len = strlen(msg_buffer); socket.SendTo(msg_buffer,len,dst_addr); memset(msg_buffer,0,msg_len); //clear out the message } }
int main(int argc, char* argv[]) { UINT16 serverPort = 0; ProtoAddress serverAddr; if (3 == argc) // "simple listen <portNumber>" { if (!strncmp("listen", argv[1], strlen(argv[1]))) { if (1 != (sscanf(argv[2], "%hu", &serverPort))) { fprintf(stderr, "simple: bad <port>\n"); serverPort = 0; } } } else if (4 == argc) // "simple connect <serverAddr> <serverPort> { if (!strncmp("connect", argv[1], strlen(argv[1]))) { if (1 != (sscanf(argv[3], "%hu", &serverPort))) { fprintf(stderr, "simple: bad <serverPort>\n"); serverPort = 0; } else if (!serverAddr.ResolveFromString(argv[2])) { fprintf(stderr, "simple: bad <serverAddr>\n"); serverPort = 0; } else { serverAddr.SetPort(serverPort); } } } if (!serverAddr.IsValid() && (0 == serverPort)) { usage(); return -1; } if (serverAddr.IsValid()) // connect to server address as a "client" and make a request { ProtoSocket clientSocket(ProtoSocket::TCP); fprintf(stderr, "simple: client connecting to server: %s/%hu ...\n", serverAddr.GetHostString(), serverAddr.GetPort()); if (!clientSocket.Connect(serverAddr)) { fprintf(stderr, "simple: error connecting to server: %s/%hu\n", serverAddr.GetHostString(), serverAddr.GetPort()); return -1; } fprintf(stderr, "simple: client sending request to server ...\n"); char* clientRequest = "Hello Server, this is a simple protolib client!"; unsigned int length = strlen(clientRequest) + 1; unsigned int sent = 0; while (sent < length) { unsigned int numBytes = length - sent; if (!clientSocket.Send(clientRequest+sent, numBytes)) { fprintf(stderr, "simple: error sending to server\n"); clientSocket.Close(); return -1; } else { sent += numBytes; } } fprintf(stderr, "simple: client awaiting response from server ...\n"); bool receiving = true; while (receiving) { char buffer[256]; buffer[256] = '\0'; unsigned int numBytes = 255; if (!clientSocket.Recv(buffer, numBytes)) { fprintf(stderr, "simple: error receiving from server\n"); clientSocket.Close(); return -1; } else if (numBytes > 0) { fprintf(stdout, "simple: client recvd \"%s\" from server: %s/%hu\n", buffer, serverAddr.GetHostString(), serverAddr.GetPort()); } else { fprintf(stderr, "simple: server shutdown connection.\n"); receiving = false; } } // end while(receiving) clientSocket.Close(); } else // act as a "server" listening to the indicated port, responding to requests { for (;;) { ProtoSocket serverSocket(ProtoSocket::TCP); if (!serverSocket.Listen(serverPort)) { fprintf(stderr, "simple: server error listening\n"); serverSocket.Close(); return -1; } else { fprintf(stderr, "simple: server listening on port:%hu ... (use <CTRL-C> to exit)\n", serverPort); if (!serverSocket.Accept()) { fprintf(stderr, "simple: server error accepting connection\n"); serverSocket.Close(); return -1; } fprintf(stderr, "simple: server accepted connection from client: %s/%hu ...\n", serverSocket.GetDestination().GetHostString(), serverSocket.GetDestination().GetPort()); bool receiving = true; while (receiving) { char buffer[256]; buffer[256] = '\0'; unsigned int numBytes = 255; if (!serverSocket.Recv(buffer, numBytes)) { fprintf(stderr, "simple: error receiving from client\n"); serverSocket.Close(); return -1; } else if (numBytes > 0) { fprintf(stdout, "simple: server recvd \"%s\" from client: %s/%hu\n", buffer, serverSocket.GetDestination().GetHostString(), serverSocket.GetDestination().GetPort()); if (NULL != strchr(buffer, '!')) { fprintf(stderr, "simple: server recvd EOT character '!' from client ...\n"); receiving = false; } break; } else { fprintf(stderr, "simple: client closed connection\n"); receiving = false; } } fprintf(stderr, "simple: server sending response to client ...\n"); char* serverResponse = "Hi there Client, this is a simple protolib server"; unsigned int length = strlen(serverResponse) + 1; unsigned int sent = 0; while (sent < length) { unsigned int numBytes = length - sent; if (!serverSocket.Send(serverResponse+sent, numBytes)) { fprintf(stderr, "simple: error sending to client\n"); serverSocket.Close(); return -1; } else { sent += numBytes; } } serverSocket.Shutdown(); // After "Shutdown" on a blocking socket, ProtoSocket::Recv() will unblock upon // receiving "FIN" from client TCP char buffer[8]; unsigned int numBytes = 8; serverSocket.Recv(buffer, numBytes); if (0!= numBytes) fprintf(stderr, "simple: server received extra data from client?\n\n"); else fprintf(stderr, "simple: server transmission complete.\n\n"); } serverSocket.Close(); } // end for (;;) } } // end main();
bool Win32Vif::ConfigureTap(char* adapterid,char* vifName,ProtoAddress vifAddr,unsigned int maskLen) { ULONG status; HKEY key; DWORD nameType; const char nameString[] = "Name"; char regpath[1024]; char nameData[1024]; long len = sizeof(nameData); /* Find out more about this adapter */ sprintf(regpath, "%s\\%s\\Connection", NETWORK_CONNECTIONS_KEY, adapterid); /* Open the adapter key */ status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regpath, 0, KEY_READ, &key); if (status != ERROR_SUCCESS) { PLOG(PL_WARN,"Win32Vif::ConfigureTap() Error opening adapter registry key:%s\n",regpath); return false; } /* Get the adapter name */ status = RegQueryValueEx(key, nameString, NULL, &nameType, (LPBYTE)nameData, (LPDWORD)&len); if (status != ERROR_SUCCESS) // ljt || nameType != REG_SZ) { PLOG(PL_ERROR,"Win32Vif::ConfigureTap() Error opening registry key: %s\n%s\n%s\n\n", NETWORK_CONNECTIONS_KEY,regpath,"Name"); return false;; } RegCloseKey(key); /* Configure the interface */ char cmd[256]; char subnetMask[16]; ProtoAddress subnetMaskAddr; subnetMaskAddr.ResolveFromString("255.255.255.255"); ProtoAddress tmpAddr; subnetMaskAddr.GetSubnetAddress(maskLen, tmpAddr); sprintf(subnetMask," %s ", tmpAddr.GetHostString()); sprintf(cmd, "netsh interface ip set address \"%s\" static %s %s ", nameData, vifAddr.GetHostString(), subnetMask); if (LONG ret = system(cmd)) { PLOG(PL_ERROR,"Win32Vif::ConfigureTap(%s) Open failed. netsh call returned: %u", nameData, ret); return false; } // Rename the connection if (strcmp(nameData, vifName) != 0) { sprintf(cmd, "netsh interface set interface name=\"%s\" newname=\"%s\"", nameData,vifName); if (LONG ret = system(cmd)) { PLOG(PL_ERROR,"Win32Vif::ConfigureTap(%s) Rename failed (%s). netsh call returned: %u", nameData, vifName, ret); return false; } } PLOG(PL_INFO,"Win32Vif::ConfigureTap() Tap opened on interface: %s\n",vifName); /* set driver media status to 'connected' */ status = TRUE; if (!DeviceIoControl(tap_handle, TAP_IOCTL_SET_MEDIA_STATUS, &status, sizeof (status), &status, sizeof (status), (LPDWORD)&len, NULL)) PLOG(PL_WARN, "Win32Vif::ConfigureTap() warning: The TAP-Win32 driver rejected a TAP_IOCTL_SET_MEDIA_STATUS DeviceIoControl call."); return true; } // end Win32Five::ConfigureTap()
bool Win32Vif::FindIPAddr(ProtoAddress vifAddr) { // Iterate through addresses looking for an address match ULONG bufferSize = 0; ULONG index = 0; if (ERROR_INSUFFICIENT_BUFFER == GetIpAddrTable(NULL, &bufferSize, FALSE)) { char* tableBuffer = new char[bufferSize]; if (NULL == tableBuffer) { PLOG(PL_ERROR, "ProtoSocket::GetInterfaceName() new tableBuffer error: %s\n", ::GetErrorString()); return false; } MIB_IPADDRTABLE* addrTable = (MIB_IPADDRTABLE*)tableBuffer; if (ERROR_SUCCESS == GetIpAddrTable(addrTable, &bufferSize, FALSE)) { for (DWORD i = 0; i < addrTable->dwNumEntries; i++) { MIB_IPADDRROW* entry = &(addrTable->table[i]); ProtoAddress tempAddress; tempAddress.SetRawHostAddress(ProtoAddress::IPv4, (char*)&entry->dwAddr, 4); if (tempAddress.HostIsEqual(vifAddr)) { return true; // ljt fix me MIB_IFROW ifEntry; index = entry->dwIndex; if (NO_ERROR != GetIfEntry(&ifEntry)) { PLOG(PL_ERROR, "ProtoSocket::GetInterfaceName() GetIfEntry(%d) error: %s\n", i, ::GetErrorString()); return false; } delete[] tableBuffer; break; } } } else { PLOG(PL_WARN, "ProtoSocket::GetInterfaceName(%s) warning GetIpAddrTable() error: %s\n", vifAddr.GetHostString(), GetErrorString()); } delete[] tableBuffer; } if (index) { // we found one - add another address // ljt need to check if this is a vif etc // maybe don't do this at all? just fail // if we've found one? ULONG status = TRUE; UINT tmpIPAddr; UINT tmpIPMask; ULONG NTEContext = 0; ULONG NTEInstance = 0; tmpIPAddr = inet_addr(vifAddr.GetHostString()); tmpIPMask = inet_addr("255.255.255.0"); if ((status = AddIPAddress(tmpIPAddr, tmpIPMask, index, &NTEContext, &NTEInstance)) != NO_ERROR) { PLOG(PL_ERROR,"Win32Vif::Open() AddIPAddress call failed with %d\n",status); return false; } return true; } return false; } // end Win32Vif::FindIPAddr()