我想在发送方不断地对同一个接收方发送数据,
for()
{
send();
}
我设置了不延时发送,即不等缓冲区满就发送出去了,请问这样写合适吗
接收方要怎样写recv()才能正确地接收到发的消息?

解决方案 »

  1.   

    send的是一个数据包,有包头。楼上你觉得我这样写有问题吗,它send的时候,接受方是不是就立刻能recv了,我那个for循环了N次,接受方是不是也接受了N次呢
    接受方具体应该怎样写才能正确接受呢
      

  2.   

    "我设置了不延时发送,即不等缓冲区满就发送出去了",你并不能保证缓冲区什么时候满,什么时候空,只有在检查SEND的返回值为满时才能确定缓冲区满了,既然都没保证发送是否完整发送数据,接收也没意义了.退一步说,接收只要处理好粘包,不需要考虑缓冲区的问题.
      

  3.   

    你send 100次,不见得地方 要recv100次,对方也有缓冲区……
      

  4.   

    其实我只是想建立一个握手机制,就是我send一次,对方回我一次,然后再send,不知道具体思路是怎样的
      

  5.   

    recv一次可能接收几次send的数据,
    定好数据格式,收到数据按格式解就可确定send的次数
      

  6.   

    那样子的话,比较难实现,毕竟,你可能send 4次数据而对方1次就能全部收到,所以,你是不能停下来专门听对方send的。
    你过你想实现IM的那种在线机制,你可以搜索一下“心跳”,会解释的很清楚的,这种机制是在使用另外一个端口发送心跳信息。
    你可以而模仿一下。不过,你也可以这样,把每次的数据信息长度固定化,比如,每次发送100字节,然后等待对方回馈信息。
    对方接受的时候,每接受100字节,然后发出回馈信息。
      

  7.   


    这个不延时发送设置有什么作用?
    TCP最终要变成IP包传递的
    你能保证接收IP层的不延时?
    很有可能到接收端,在程序下一次接收前,两个TCP包都OK了
    所以这种设置只能自我YY一下
    实际运行中是没用,也不现实的
    这种流的东西,别指望靠一个什么设置就可以按你说的次序一样达到并接收,不现实
      

  8.   


    这个要看网络负载的,你SEND一下发一个完整的包,但是发送是前后连贯的,也许你之前的包已经占满了发送缓存,而客户端的接收又还没处理,那么发送当前包时你不顾缓冲区是否还装得下,强制发送,则会返回发送失败,此时需要等待"可写"通知,否则会丢失这个包.
      

  9.   

    TCP已经有握手机制了.还需要自己实现么??
    还真会浪费资源.
      

  10.   

    楼上的,我不是指这种TCP 的三次握手
     服务器Listen();   
     客户端Connect();   发送SYN,服务端响应,connect连接成功   
     服务器Accept(); 我指的是每执行一次send,要等到服务器recv后返回我一个信息我再send。 
      

  11.   

    C:
    while(true)
    {
    send(buff100);
    if(sendout)break;
    receive(response_form_server);
    }
    S:
    while(true)
    {
    receive(buff1000);//此处要做判断,每次只收100,还要判断是否接受结束。
    send(response);
    }
      

  12.   

    你可以用select模型,select在socket上等待,如果有数据可读后,select返回,这样你再调用recv函数,就可以接受了.
      

  13.   

    大致的代码就是:
    senddata=::send(m_socket,m_pSendBuf,m_LogicPackLen,0);
    if(senddata<=0)
    {
       if(GetLastError()!=WSAEWOULDBLOCK)
    break;   //在这里响应FD_WRITE通知或者简单点做一下SLEEP也可以,然后CONTINUE;}
      

  14.   

    通信 一般需要采用一些通信模型进行编程  如果初学的话 可以了解下SLELCT模型 异步消息模型 异步事件模型先看异步消息模型吧 很简单   
    有数据的时候 有消息(FD_READ)会通知你 不过它需要有窗口 
      

  15.   

    是的,我是用了select模型。问题现在解决了。想收发一一对应的话,可以有两种办法,第一种就像22楼说的那样,send完紧接写上recv,其实这种做法相当于另外开一个监听线程,在send使用完后在等待服务器返回一个消息再继续发。第二种是我正在用的办法,把客户端的发送模式设置为阻塞,服务器为非阻塞,这样send的时候,系统会等到接收方的接受缓冲区有空间接收的时候才会发。这时候只要在服务器那边设置好接受的格式就可以了。谢谢大家的共同探讨!
      

  16.   

    想问个问题,send()只是负责将数据发送到buf里,那么TCP如何保证在传输过程的安全呢?(例如传输时被干扰导致丢包的情况,是DataLink的功能么?)