在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 );