c++读取web上传的图片内容丢失

使用web实现图片上传的时候,服务段接收的数据总是只接收到图片内容的前几个字节就结束了,其他http-json报文都可以正常发送接收,此前在局域网都是正常的,后来部署到云服务器上,通过公网就开始出现问题,

使用的c++做的web服务器

这是接收的函数,

ssize_t Buffer::ReadFd(int fd, int* saveErrno) {
    char buff[1024*1024];
    struct iovec iov[2];
    const size_t writable = WritableBytes();
    /* 分散读, 保证数据全部读完 */
    iov[0].iov_base = BeginPtr_() + writePos_;
    iov[0].iov_len = writable;
    iov[1].iov_base = buff;
    iov[1].iov_len = sizeof(buff);

    const ssize_t len = readv(fd, iov, 2);

    if(len < 0) {
        *saveErrno = errno;
    }
    else if(static_cast<size_t>(len) <= writable) {
        writePos_ += len;
    }
    else {
        writePos_ = buffer_.size();
        Append(buff, len - writable);
    }
    return len;
}




ssize_t len = -1;
    do {
        //LOG_DEBUG("============>readBuff_.ReadFd");
        len = readBuff_.ReadFd(fd_, saveErrno);
        if (len <= 0) {
            break;
        }
    } while (isET);
    return len;

望采纳


你提到的问题可能是由于网络原因引起的,而不是代码本身的问题。

在部署到云服务器后,您需要确保网络连接良好,以便能够正常接收和传输数据。可以尝试在网络连接不良时重新连接或重试,以确保能够正常接收到整个图像数据。

另外,在上面的代码中,可以尝试打印 len 的值,以了解数据读取的状态。例如,如果 len 的值等于零,则表示没有更多数据可读取。如果 len 的值小于零,则表示发生错误。

如有帮助,望采纳

当你使用String realPath = ServletActionContext.getServletContext().getRealPath(  "/images");得到发布到服务器的存取图片的文件夹时,你先把文件上传到这个文件夹。同时你要新定义一个文件,把这个文件的路径设为eclipse工作区间下的工程下的WebContent目录下。这样就能保证这张你现在上传的图片能够和其它文件一样发布到服务器上。


任何语言,任何协议,网络传输文件,接收文件的底层逻辑:
循环读socket,读到一段数据,写入一段数据到文件
不是只读一次

服务端用java、nodejs、go等语言比较合适,本身的语言和库就比较完善,开发便利不容易出错

用C、C++的话,建议找个开源库

就看上面贴的代码,比较容易出问题,写一个稳定的健壮的互联网程序很多细节要考虑
tcp是流式的注意读取的连续性
第一步:错误码处理最少要处理如下情况:
1.如果read返回是的0 ,说明socket已经关闭了需要重新建立连接读取
2.如果fd是非阻塞的,如果read返回-1,然后要结合错误码判断是否是正常的INT和AGAIN啥的,要继续读取等等
3.如果fd是阻塞的,如果read返回-1,说明很可能超时了,估计需要重新建立连接
第二步:看下发送端的错误情况和发送字节的情况
第三步:可以抓包看下客户端和服务端的交互过程