+ -
当前位置:首页 → 问答吧 → 用socket非阻塞发送文件出错

用socket非阻塞发送文件出错

时间:2011-12-17

来源:互联网

用WSAAsyncSelect(m_socket,m_hWnd,SERVER_MESSAGE,FD_WRITE|FD_ACCEPT|FD_READ|FD_CLOSE)非阻塞发送文件出错

客户端发送代码C/C++ code
int filesize;
            CFile file(filename, CFile::modeRead);
            filesize = (int)file.GetLength();
            
            char buff[1024];
            while(filesize > 0)
            {
                int read_len = file.Read(buff, sizeof(buff));
                int send_len = send(wparam, buff, read_len, 0);
                filesize = filesize - send_len;
            }

            file.Close();

服务端接收代码C/C++ code
    CFile file;
    file.Open(filename, CFile::modeCreate|CFile::modeWrite);

    char buff[1024];
    while(filesize > 0)
    {
        int recv_len = recv(m_socket_client, buff, sizeof(buff), 0);
        file.Write(buff, recv_len);
        filesize = filesize - recv_len;
    }

    file.Close();

作者: lin_c   发布时间: 2011-12-17

能把具体错误说下吗

作者: shn521   发布时间: 2011-12-17

楼主说的太模糊了,得把错误码记录一下,send和recv的时候
还有,既然用异步模式,就要在FD_READ消息来得时候再读取数据
楼主贴得代码也比较少,不知道用的UDP还是TCP?

作者: hnwyllmm   发布时间: 2011-12-17

是用TCP传输的 能不能在接收文件的时候把异步模式改为同步模式 这样就可以连续的接收数据了

作者: lin_c   发布时间: 2011-12-17

while(filesize > 0)
{
  int read_len = file.Read(buff, sizeof(buff));
  int send_len = send(wparam, buff, read_len, 0);
  filesize = filesize - send_len;
}

显然就是这里有错误了,如果send_len<read_len,那么你的文件数据就丢失了,那下次循环时,你应该先调用Seek方法进行文件操作位置的调整

作者: fishion   发布时间: 2011-12-17

还有就是你得保证两边的filesize 值是一样的

作者: fishion   发布时间: 2011-12-17