socket tcp 发送大数据或文件注意事项

由于使用TCP发送大数据或文件时容易发生数据丢失,其主要原因是在发送此类数据时,不能确保数据的每个字节都发送到接收方。

发送通常文件使用如下方式:

FILE *File = fopen(filePath, "rb");  
if(NULL == File)
return false;
fseek(File, 0, SEEK_SET); 
char Buff[1024] = {0};
int ulFaceReadByte;
while(!feof(File))
{
ulFaceReadByte = fread(Buff, 1, 1024, File);   
send(s, Buff, ulFaceReadByte, 0);
}
fclose(File);

         但是此方法不能够确保每次发送的数据都能成功,从而使得数据丢失。因此改进原有方式为:

FILE *File = fopen(filePath, "rb");  
if(NULL == File)
return false;
fseek(File, 0, SEEK_SET); 
char Buff[1024] = {0};
int ulFaceReadByte;
while(!feof(File))
{
ulFaceReadByte = fread(Buff, 1, 1024, File);    
while(!send(s, Buff, ulFaceReadByte, 0) ) ;

}
fclose(File); 

        增加一条while语句确保将所有的数据都发送出去。

       同理发送大数据时也是增加while(!send(s, Buff, ulFaceReadByte, 0) ); 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QTcpSocket协议可以通过以下步骤发送文件: 1. 打开文件并读取文件内容。 ``` QFile file(filePath); if (!file.open(QIODevice::ReadOnly)) { qWarning("Can't open file for reading"); return; } QByteArray fileData = file.readAll(); ``` 2. 连接到服务器并发送文件大小。 ``` QTcpSocket socket; socket.connectToHost(host, port); if (!socket.waitForConnected()) { qWarning("Can't connect to server"); return; } qint64 fileSize = file.size(); socket.write(reinterpret_cast<const char*>(&fileSize), sizeof(fileSize)); socket.flush(); ``` 3. 等待服务器确认收到文件大小。 ``` if (!socket.waitForReadyRead()) { qWarning("Did not receive confirmation from server"); return; } qint64 bytesReceived = socket.read(sizeof(bytesReceived)); if (bytesReceived != sizeof(bytesReceived)) { qWarning("Did not receive confirmation from server"); return; } ``` 4. 发送文件内容。 ``` qint64 bytesWritten = 0; while (bytesWritten < fileSize) { qint64 bytesToWrite = qMin(fileSize - bytesWritten, static_cast<qint64>(socket.bytesToWrite())); qint64 bytesActuallyWritten = socket.write(fileData.mid(bytesWritten, bytesToWrite)); if (bytesActuallyWritten == -1) { qWarning("Error writing to server"); return; } bytesWritten += bytesActuallyWritten; } socket.flush(); ``` 5. 等待服务器确认收到文件内容。 ``` if (!socket.waitForBytesWritten()) { qWarning("Did not receive confirmation from server"); return; } if (!socket.waitForReadyRead()) { qWarning("Did not receive confirmation from server"); return; } qint64 bytesReceived = socket.read(sizeof(bytesReceived)); if (bytesReceived != sizeof(bytesReceived)) { qWarning("Did not receive confirmation from server"); return; } ``` 6. 关闭连接。 ``` socket.disconnectFromHost(); ``` 以上是一个简单的发送文件的示例,需要注意的是,如果文件较大,可能需要分段发送并且需要处理接收方的缓冲区溢出等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值