【问题标题】:Sockets c++ , weird issue with recieved info [closed]套接字c ++,收到信息的奇怪问题[关闭]
【发布时间】:2014-09-27 09:48:18
【问题描述】:

事情就是这样:我想制作一个远程 cmd,所以每当我在工作时,我都可以从家里的计算机上下载文件,由于某种原因,它没有以我想要的方式响应,当我发送 dir 命令时它甚至不执行if 语句。

如果这很明显我对这些东西很陌生,请原谅我。

注意事项: 服务器连接,客户端打印出发送的缓冲区。

这些是不同的程序 v

服务器.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;

}

客户端.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;
}

【问题讨论】:

  • 除了忽略 recv() 调用的结果(由@EJP 回答)之外,以下 printf 调用假定 RecvBuffer' 包含一个以 null 结尾的 C 字符串。那不是锁。
  • ...而且,(在网络代码中似乎几乎不可避免)滥用 strlen: automatic storage var 'char File[1500];'紧随其后的是 'recv(sConn, File, strlen(File), 0);'。
  • 大约。 SO 网络代码问题中 1% 的 strlen() 调用是有效的。
  • .. 而 printf() 也不甘落后。
  • '删除文件;'在自动存储变量上 - segfault/UB。

标签: c++ sockets client system


【解决方案1】:

recv() 不能保证填充缓冲区。你必须循环。

【讨论】:

  • 什么意思?我在一个循环?还是应该按字符接收字符?感谢您的回复!
  • @GuyI 收到的消息可能是漏洞消息的一部分。为了得到这一切,你应该使用一个循环来接收每次迭代的部分。
猜你喜欢
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多