nResult=send(m_hSocket, (LPSTR)pHead->szBuf, pHead->MSG_LEN+16,nFlags);上面的发送:其中pHead->szBuf我定义了约100000个字节,发送时
   pHead->MSG_LEN+16==49276  
但nResult只返回9432,我是和一个java服务器通信,她也只收到了9432。我该怎么办?非常感谢!

解决方案 »

  1.   

    socket不是你家的自来水管,想传多少就传多少的,有mtu和其他因素的限制,你要做个循环,一点一点传,同时接受方最好有应答.
      

  2.   

    小西瓜:我该怎么一点一点传送?tcp/ip 不是可以自己拆分传输吗?其中的拆分传输还要我来管理
    阿?你说的是如下这样传送吗?char* p=pHead->szBuf;
    int sendLen=1000;while(pHead->MSG_LEN+16>0){
    if(pHead->MSG_LEN+16<1000)sendLen=pHead->MSG_LEN+16;
    send(m_hSocket, p, sendLen,nFlags);
    p+=1000;
    pHead->MSG_LEN+16-=1000;
    }
    关键是我的数据是一个整体,拆分了服务器看得懂吗?服务器是不是还需要人为的再组合起来?并且客户端还要发一个结束包?这搞得复杂了,我原想直接给出整个包的长度,就让他一个包不管怎样一次send发完。这办不到啊?难道只能拆分吗?
      

  3.   

    IP包的长度是有限制的 你需要分快发送 比如开辟一个1000个字节的缓冲区 把数据分块放进去发送 对方接收以后放进内存 不需要什么重组 只需要接到你原来接收的后面就可以了 你数据是整体发送到对方不也是整体了 ??
    如果你想40几K一次传完 你好好的看看TCP/IP方面的资料吧 在发送的时候你先发送整个包的长度不就可以验证发送的正确性???这是你定义的传输通讯协议的问题了
      

  4.   

    必须分开传送,这个CSocket的限制。
    你必须如你所说的传,不论数据大小,发送后都要检查发送结果状态,如果不够长度的话要再传,客户端也是一样的,接受的时候,如果不够长度的话,要再接收。
    发送和接受都要持续到数据传送完毕或者网络异常再结束。
    如果总数据长度客户端不知道,那么要约定一个定长数据头,并且在数据头内至少给出接下来的数据长度。客户端先接受定长数据头,然后根据数据头信息接收数据。
    如果采用TCP协议,那么不用自己关心每次发出的数据完整性,但客户端要负责把多次收到的数据组合(注意,不是底层协议级的,是你每一次的Recive)起来。
    如果采用UDP协议,那么要自己保证数据完整性和序列性,这个时候你的数据头内至少还要有一个序列号信息。
      

  5.   

    你还可以参考Indy9(Delphi/BCB组件)里边TCP/UDP相关组件的实现,对发送和接收进行了封装,不用自己处理这些异常。其Send只需给出Buf和Len就会保证全部发出。其Recive只要给出Buf和Len就会接收,直到接收完成或者超时返回。真希望MFC的封装也能进步一些。
    还有啊,本人知道TCP/IP协议有底层分包的大小限制,默认是1500Byte,和网卡、路由器等网络路径上的节点有关系,我说的话有些地方可能表述的不准确,希望不要会意错了。
      

  6.   

    多谢诸位,我用的是socket api, 经mfkzj() 和iting(倚天)两位朋友的指点有些明白了,to mfkzj():
    但是就是服务端必须一直recieve直到他收到我协议头里指定大小的数据之后才能停止,对巴?还有就是服务端如何recieve和客户端如何send无关吗?例如上面我40k的数据 send了20次,但是在服务端我并不需要recieve20 次吧,几次比较好呢?据说send recieve可以优化,每次send  1k左右最好,是这样吗?我上面的代码可以吗?
    我想是不是send时,tcp/ip的协议栈的大小决定了一次send大小的限制,我每次send大小最大值好像都在10k左右,是这样的吗
      

  7.   

    没办法呀,我客户端是vc 服务端是java ,要都是用mfc或者delphi来做可能就很简单了
      

  8.   

    http://wangfeng.vicp.net/mymmsc/index.asp
      

  9.   

    如果你是美女,就看看我的解答:
    如果你没有利用任何别的函数裤,那么注定你必须用循环来传,一直到传玩为止
    接受方呢,则可以一次性接受,随便你要接受多少字节都可以估计你可能对网络编程不是很了解,发送方和接受方没有什么逻辑上的关系,我的意思是:不考虑网络出故障的情况下,发送100个字节,你可以send100次,而接受方只需要一次receive就能完全搞定
    反过来,你send1次,receive100次也不会有问题
      

  10.   

    BABIZHU(巴比猪) ( ) 信誉:97 你的描述不全对。当接收缓冲区小于要接收的数据量,且数据是用UDP方式发送的,你可以一次Recieve完吗?