2014-09-27 4 views
-1

Ну, это штука: я хочу сделать удаленный cmd, поэтому всякий раз, когда я на работе, я могу загружать файлы с моего домашнего компьютера, потому что иногда они не реагируют так, как я хочу, когда i отправьте команду dir, она даже не выполняет оператор if.Сокеты C++, странная проблема с полученной информацией

Пожалуйста, простите меня, если это очевидно. Я новичок в этих вещах.

Примечания: Сервер подключается, и клиент распечатывает отправленный буфер.

те различные программы v

server.cpp

#include "FirstTouch.h" 
#pragma comment(lib,"ws2_32") 

void SendCommands() 
{ 
while (1) 
{ 
    char SendBuffer[1500]; 
    cin >> SendBuffer; 
    send(sConn, SendBuffer, 1500, 0); 

    if (SendBuffer == "dir") 
    { 
     printf("system_dir initiated\n"); 
     Sleep(200); 
     char File[1500]; 
     recv(sConn, File, strlen(File), 0); 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 9); 
     cout << File << endl; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 5); 
     delete File; 
    } 
} 

} 


int main() 
{ 

ConnectToServer(); 
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 5); 
printf("connected"); 
system("cls"); 
SendCommands(); 
return 0; 

} 

client.cpp

#include <winsock.h> 
#include <iostream> 
#pragma comment(lib,"ws2_32") 

SOCKET s; //Socket handle 

//CONNECTTOHOST – Connects to a remote host 
bool ConnectToHost(int PortNo, char* IPAddress) 
{ 
    //Start up Winsock… 
    WSADATA wsadata; 

    int error = WSAStartup(0x0202, &wsadata); 

    //Did something happen? 
    if (error) 
     return false; 

    //Did we get the right Winsock version? 
    if(wsadata.wVersion != 0x0202) 
    { 
     WSACleanup(); //Clean up Winsock 
     return false; 
    } 

    //Fill out the information needed to initialize a socket… 
    SOCKADDR_IN target; //Socket address information 

    target.sin_family = AF_INET; // address family Internet 
    target.sin_port = htons(PortNo); //Port to connect on 
    target.sin_addr.s_addr = inet_addr(IPAddress); //Target IP 

    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //Create socket 
    if (s == INVALID_SOCKET) 
    { 
     return false; //Couldn't create the socket 
    } 

    //Try connecting... 

    if (connect(s, (SOCKADDR *)&target, sizeof(target)) == SOCKET_ERROR) 
    { 
     return false; //Couldn't connect 
    } 
    else 
     return true; //Success 
} 

//CLOSECONNECTION – shuts down the socket and closes any connection on it 
void CloseConnection() 
{ 
    //Close the socket if it exists 
    if (s) 
     closesocket(s); 

    WSACleanup(); //Clean up Winsock 
} 



int main() 
{ 
    bool Conn = false; 
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN); 
    printf("Trying to make a reliable connection to server..."); 
    while (!Conn) 
    { 
     Conn = ConnectToHost(444, "127.0.0.1"); 
    } 

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 5); 
    system("cls"); 
    printf("Connected say hi!\n"); 
    while (1) 
    { 

     char RecvBuffer[1500]; 
     recv(s, RecvBuffer, 1500, 0); 
     printf(RecvBuffer); 
     std::cout << std::endl; 

     if (RecvBuffer == "dir") 
     { 
      printf("Executing...\n"); 
      Sleep(100); 
      system("dir >> temp.txt"); 
      HANDLE hFile = CreateFile("temp.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
      LPVOID FileContent = nullptr; 
      LPDWORD NumOfBytes = nullptr; 
      ReadFile(hFile, FileContent, 1500, NumOfBytes, NULL); 
      CloseHandle(hFile); 
      delete[] NumOfBytes; 
      send(s, (char*)FileContent, 1500, 0); 
      delete FileContent; 
     } 

    } 

    return 0; 
} 
+0

Помимо игнорирования результата вызова recv() (как указано в @EJP), следующий вызов printf предполагает, что RecvBuffer 'содержит C-строку с нулевым завершением. Это не замок. –

+0

... и, (это кажется почти неизбежным в сетевом коде), неправильное использование strlen: автоматическое хранилище var 'char File [1500];' а затем сразу: recv (sConn, File, strlen (File), 0); '. –

+0

Прибл. 1% вызовов strlen() в запросах сетевого кода SO действительны. –

ответ

0

ПРИЕМ() не гарантируется для заполнения буфера. Вы должны зациклиться.

+0

Что вы имеете в виду? Я в петле? или должен получить char char? благодарит за ответ! –

+0

@GuyI Полученное сообщение может быть частью сообщения о дыре. Чтобы получить все это, вы должны использовать цикл для приема частей на каждой итерации. – wowofbob

Смежные вопросы