本人用CSocket编写了一个局域网文件传输软件,如果在本机上运行客户端和服务器都能把文件传输过来,但是吧客户端放到局域网的其他电脑上连接本机的服务器,虽然文件也能传输,但是会包含很多空字符,而且Send操作和Recieve操作也不是一一对应(即那边一个Send,服务器这端就一个Recieve),竟出现Recieve应该是接收到的是前一条Send的部分内容和后一条Send的内容的结合体,比如第一次Send("AAAAAAAAAAAAAAAAA",1024);第二次Send(“#Ready#”,1024)但是第一次Receive有时候收到好像是空的,有时候第二条Receive收到的是“AAAAAAAAAA#Ready#"我很不解,这个和接收缓冲区有关么,还是和CSocket的实现机制有关,那位大侠能够说的详细点,如果说好了必定大大加分。最好也能说一下CSocket的运行机制。

解决方案 »

  1.   

    什么粘包,兰州用的tcp,是流,不是包,
      

  2.   

    可以连续send,但tcp是不会给你一个边界的,区别于udp
      

  3.   

    还有不是一次Send对应一次Receive么,不是CSocket的是阻塞的么,如果Send不过去那就会一直Send的
      

  4.   

    设置协议
    比如数据前面加个长度
    先接受长度
    然后循环接收
    while(culen < len)
    {
    ////接收
    }
      

  5.   

    告诉7楼的我好像就是这么做的只不过用for了 但是...问题啊!不过我在试一试
      

  6.   

    我就是想问
    1.怎么清空,socket的缓冲区
    2.是不是每次Send都必须有一个Receive与之对应
    3.Csocket的TCP传输运行机制到底是怎样的即怎么传,怎么收?
    4.我已经濒临崩溃了,谁答对疯狂的加分,虽然已经很穷了
      

  7.   

    1.怎么清空,socket的缓冲区
      不必管buffer
    2.是不是每次Send都必须有一个Receive与之对应
      重申tcp是无边界的,coder应该知道要read(recv)多少字节数据
    3.Csocket的TCP传输运行机制到底是怎样的即怎么传,怎么收? 
      你可以每次先read(recv)一个sizet_t length的分节,然后你就知道下一个分节要recv多长
    4.我已经濒临崩溃了,谁答对疯狂的加分,虽然已经很穷了。
      此题无界
      

  8.   

    socket的缓冲时不能你来清空的,但是你可以清空你自己用来接收和发送的buf(发送建议定义一个struct)大体该是这样
    比如struct Data
    {
        long len;
        char buf[4096];
    }
    ///发送
    Data data;
    memset(&data,0,sizeof(Data));   ///清空
    ///赋值
    send(&data,data.len) ;////接收
    memset(&data,0,sizeof(Data));   ///清空
    receive(&data.len,sizeof(long));while(culen < len)
    {
    ///}
                                   
      

  9.   

    Csocket最好用onreceive来接收缓冲区有数据
    就会响应这个事件