Exemple #1
0
bool Pipe2Sock::ProcessCommands(int argc, const char*const* argv)
{
    // Dispatch command-line commands to our OnCommand() method
    int i = 1;
    while ( i < argc)
    {
        if (!strcmp("listen", argv[i]))
        {
            i++;
            strcpy(listen_pipe_name,argv[i]);
        }
        else if (!strcmp("send", argv[i]))
        {
            i++;
            const char* index = strchr(argv[i],'/');
            if(index!=NULL)
            {
                char charAddr[255];
                memset(charAddr,0,255);
                strncpy(charAddr,argv[i],index-argv[i]);
                if(!dst_addr.ResolveFromString(charAddr))
                {
                    PLOG(PL_ERROR, "Pipe2Sock::OnCommand() send error: setting dst address to %s\n",charAddr);
                    return false;
                }
                dst_port = atoi(index+1);
            }
            else
            {
                PLOG(PL_ERROR,"Pipe2Sock::OnCommand() missing \"/\" for send command\n");
                return false;
            }
        }
        else if (!strcmp("port", argv[i]))
        {
            i++;
            snd_port = atoi(argv[i]);
        }
        else
        {
            PLOG(PL_ERROR, "Pipe2Sock::OnCommand() unknown command error?\n");
            return false;
        }
        i++;
    }
    return true;
}  // end Pipe2Sock::ProcessCommands()
Exemple #2
0
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();
Exemple #3
0
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()