在c+中通过tcp/ip协议发送.txt文件+; 我试图编写一个程序,发送给服务器A.TXT文件,修改它的内容,然后将修改后的内容发送回C++中的客户端。我已经设法使tcp/ip通信对于简单的字符串文本消息可以正常工作,但是当我尝试发送.txt文件的内容时,它却失败了

在c+中通过tcp/ip协议发送.txt文件+; 我试图编写一个程序,发送给服务器A.TXT文件,修改它的内容,然后将修改后的内容发送回C++中的客户端。我已经设法使tcp/ip通信对于简单的字符串文本消息可以正常工作,但是当我尝试发送.txt文件的内容时,它却失败了,c++,sockets,tcp,C++,Sockets,Tcp,以下是我的代码片段:( 客户: fstream file; string fileName = "Test.txt"; string textToSend; int sendResult; file.open(fileName); while (!file.eof()) { getline(file, textToSend); sendResult = send(sock, textToSend.c_str(), textToSend.size() + 1, 0); } st

以下是我的代码片段:(

客户:

fstream file;
string fileName = "Test.txt";
string textToSend;
int sendResult;

file.open(fileName);

while (!file.eof())
{
    getline(file, textToSend);
    sendResult = send(sock, textToSend.c_str(), textToSend.size() + 1, 0);
}
string end_msg = "end";
sendResult = send(sock, end_msg.c_str(), end_msg.size() + 1 , 0);

file.close();

if (sendResult != SOCKET_ERROR)
{
    ZeroMemory(buf, 4096);

    int bytesReceived = recv(sock, buf, 4096, 0);

    if (bytesReceived > 0)
    {
        cout << "Server> " << string(buf, 0, bytesReceived) << endl;
    }
    else
    {
        cout << "Error on client - bytesReceived" << endl;
    }
}

// Gracefully close down everything
closesocket(sock);
WSACleanup();
}
它无法到达我的文本文件的第二行

S.S.:我是C++上的TCP/IP新手,对java有基本的经验,任何帮助都很好,谢谢。

< P>一般需要定义某种通信协议来干净地发送和接收数据,特别是如果你发送和接收多条消息。 在这里,数据是从客户端和服务器发送和接收的,不考虑状态是另一个应用程序

我猜可能是客户端关闭了连接,服务器无法发送回复,因此无法继续接收下一条消息

我不得不猜测,因为没有提供完整的代码来复制

您应该进行一些调试-检查应用程序处于哪个状态以及代码内部发生了什么。使用两个IDE—一个用于服务器,一个用于客户端

下面是一个简单的客户端,它将信息发送到服务器,而服务器只是接收信息

如果需要更复杂的场景,那么您必须考虑客户机和服务器之间的一致性,以及如何知道下一步要做什么


客户端和服务器代码根据

在//发送初始缓冲区中,函数应发送数据并检查已发送的数据量

大概是这样的:

std::ifstream file( "Test.txt" );
std::string   content( ( std::istreambuf_iterator< char >( file ) ),
                     ( std::istreambuf_iterator< char >() ) );


// Send an initial buffer
int bytes_to_send = content.length();
int bytes_sent    = 0;
do
{
    iResult = send( ConnectSocket, content.data() + bytes_sent, bytes_to_send, 0 );
    if ( iResult != SOCKET_ERROR )
    {
        bytes_to_send -= iResult;
        bytes_sent += iResult;
    }
} while ( iResult != SOCKET_ERROR && bytes_to_send > 0 );
我使用了一个2MB的测试文件,
send
命令一次发送所有数据

在接收端,数据以512字节的批次接收,这意味着循环有许多次迭代。

通常需要定义某种通信协议来干净地发送和接收数据。尤其是在发送和接收多条消息的情况下

在这里,数据是从客户端和服务器发送和接收的,不考虑状态是另一个应用程序

我猜可能是客户端关闭了连接,服务器无法发送回复,因此无法继续接收下一条消息

我不得不猜测,因为没有提供完整的代码来复制

您应该进行一些调试-检查应用程序处于哪个状态以及代码内部发生了什么。使用两个IDE—一个用于服务器,一个用于客户端

下面是一个简单的客户端,它将信息发送到服务器,而服务器只是接收信息

如果需要更复杂的场景,那么您必须考虑客户机和服务器之间的一致性,以及如何知道下一步要做什么


客户端和服务器代码根据

在//发送初始缓冲区中,函数应发送数据并检查已发送的数据量

大概是这样的:

std::ifstream file( "Test.txt" );
std::string   content( ( std::istreambuf_iterator< char >( file ) ),
                     ( std::istreambuf_iterator< char >() ) );


// Send an initial buffer
int bytes_to_send = content.length();
int bytes_sent    = 0;
do
{
    iResult = send( ConnectSocket, content.data() + bytes_sent, bytes_to_send, 0 );
    if ( iResult != SOCKET_ERROR )
    {
        bytes_to_send -= iResult;
        bytes_sent += iResult;
    }
} while ( iResult != SOCKET_ERROR && bytes_to_send > 0 );
我使用了一个2MB的测试文件,
send
命令一次发送所有数据


在接收端,数据以512byte的批次接收,这意味着循环有很多次迭代。

为什么要发送单行而不是文件的全部内容?send()和recv()是
流式的
。当您执行
int bytesReceived=recv(clientSocket,buf,4096,0);
您是说什么“尝试录制4096个字节”,但您可能只会收到其中的1024个,而您的下一次录制可能会有剩余的字节。事实上,我多次看到您犯下此错误。请解释您如何知道代码已损坏。“无法执行此操作”不是详细的问题描述(buf!=“end”)时您认为此处发生了什么@Vlad我发布的链接提供了很多细节。为什么只发送单行而不发送文件的全部内容?send()和recv()是
流式传输的
。当您发送
int bytesReceived=recv(clientSocket,buf,4096,0);
您说的是“尝试接收4096字节”“,但您可能只得到4096中的1024个,其中您的下一个recv可能有剩余的字节。实际上,我多次看到您犯此错误。请解释您如何知道代码已损坏。“它无法做到”不是详细的问题描述
while(buf!=“end”)
@Vlad我发布的链接提供了很多详细信息。非常感谢。我自己做了一些事情,而且很有效,但我必须承认,你的解决方案更符合逻辑。要回答为什么我没有把所有代码都放进去:我想这样做,但是在堆栈溢出上格式化代码的工具非常糟糕。我从来都不理解,我也不知道我浪费了20分钟来阐述我的问题,只是想弄清楚如何格式化我的代码:D.再次感谢你!对于格式化代码,我通常在IDE中格式化,并在代码周围添加额外的大括号,这给了我在代码前所需的额外空间。自动格式化后,我复制它。在格式化之前和之后,你必须留下一行空白代码。非常感谢。我自己做了一些事情,它正在工作,但我必须承认,你的解决方案更符合逻辑。为了回答为什么我没有把所有代码都放进去:我想这么做,但在堆栈溢出上格式化代码的工具太可怕了。我从来都不理解它,我浪费了20分钟来阐述我刚才的问题通过尝试找出如何格式化我的代码:D.再次感谢!对于格式化代码,我通常在IDE中格式化代码,并在代码周围添加额外的大括号,这给了我在代码前所需的额外空间。自动格式化后,我复制它。在代码前后必须保留一行空白。
std::ifstream file( "Test.txt" );
std::string   content( ( std::istreambuf_iterator< char >( file ) ),
                     ( std::istreambuf_iterator< char >() ) );


// Send an initial buffer
int bytes_to_send = content.length();
int bytes_sent    = 0;
do
{
    iResult = send( ConnectSocket, content.data() + bytes_sent, bytes_to_send, 0 );
    if ( iResult != SOCKET_ERROR )
    {
        bytes_to_send -= iResult;
        bytes_sent += iResult;
    }
} while ( iResult != SOCKET_ERROR && bytes_to_send > 0 );
// Receive until the peer shuts down the connection
do
{
    iResult = recv( ClientSocket, recvbuf, recvbuflen, 0 );
    if ( iResult > 0 )
    {
         //...

} while ( iResult > 0 );