C++ 使用send()通过TCP流将文本文件中的数据从客户端发送到服务器时,如何一次只发送4个字节以外的所有数据?

C++ 使用send()通过TCP流将文本文件中的数据从客户端发送到服务器时,如何一次只发送4个字节以外的所有数据?,c++,c++11,tcp,client-server,tcpclient,C++,C++11,Tcp,Client Server,Tcpclient,以下是my client.cpp文件的摘录: //Variables previously declared char buffer[1024]; char sendbuffer[100]; int sockfd, b; //Opens specified file FILE *fp = fopen(argv[3], "rb"); while( (b = fread(sendbuffer, 1, sizeof(sendbuffer), fp)) > 0 ) {

以下是my client.cpp文件的摘录:

//Variables previously declared
char buffer[1024];
char sendbuffer[100];
int sockfd, b;

//Opens specified file
FILE *fp = fopen(argv[3], "rb"); 

while( (b = fread(sendbuffer, 1, sizeof(sendbuffer), fp)) > 0 ) 
{
    send(sockfd, sendbuffer, b, 0);
}


<>我对客户端-服务器编程是新手,而且我远没有精通C++。

当我使用上面的代码时,它成功地发送了inf,但它显然不会一次发送4个字节的数据

如果我修改了包含send()的行,如下图所示,而没有进行其他必要的更改,我肯定它是不正确的

send(sockfd, sendbuffer, 4, 0);
调试也是一件痛苦的事情,因为当我修改代码时,我必须不断地模拟客户机-服务器交互,这需要时间来设置

一次发送4字节文本文件数据的最有效方式是什么

另外,有人能推荐一种快速调试客户机-服务器程序的工具或方法吗


如果需要更多信息,请告诉我。谢谢,您可以尝试一次发送4个字节,它可能会工作,但您无法控制流套接字实际发送的字节数。您必须检查返回值。
我认为你根本不需要调试这个程序。日志记录更好,因为它不像调试那样引入时间延迟,在网络世界中时间就是金钱。

“一次发送4字节文本文件数据的最有效方式是什么”——我希望您认识到这两个概念是多么对立。一次发送4个字节几乎是无效率的,特别是因为它与tcpip堆栈的MTU相关,如果不是更大的话,可能至少是1.5k。不管怎样,也许撤销您已经完成的操作,而将
char sendbuffer[100]
更改为
char sendbuffer[4]
会实现您似乎想要的功能。我认为您对TCP的工作原理有错误的理解—它是字节流,而不是消息流。虽然您可以一次调用4个字节的
send
,但内核仍然可以将多个
send
组合到一个数据包中以提高效率。即使禁用NAGLE可以避免这种情况,接收者仍可能
recv
超过您一次发送的4个字节,甚至更少。如果希望在TCP中具有消息语义,则需要在字节流的顶部添加适当的应用程序协议,而不是使用multiple
send