现在使用sendto函数可以实现发送,函数是这样子的:
   retval=sendto(m_socket,((PWAVEHDR) lParam)->lpData,((PWAVEHDR) lParam)->dwBytesRecorded,0,
(SOCKADDR*)&addrto1,sizeof(SOCKADDR));
  问题是一直接收失败,接收函数是这样子的:
   retval=recvfrom(sock,(char *)theApp.tempBuf,sizeof(theApp.tempBuf),0,(SOCKADDR*)&addrFrom,&len);
其中theApp.tempBuf是在APP类里这样定义的:PBYTE tempBuf;初始化为: tempBuf = reinterpret_cast<PBYTE>(malloc(1));主要是用它来保存接收到的音频数据,因为在其它函数里还要用到,就定义为全局的了。不知这样可行不?
  如果不可以的话,请大侠们指点指点,非常感谢!

解决方案 »

  1.   

    recvfrom 的第三个参数好象有问题
      

  2.   

    sizeof(theApp.tempBuf)为4
    到底要收多少个字节?
      

  3.   

    是的.
    int recvfrom (
      SOCKET s,                   
      char FAR* buf,              
      int len,                    
      int flags,                  
      struct sockaddr FAR* from,  
      int FAR* fromlen            
    );
     
    Parameters

    [in] A descriptor identifying a bound socket. 
    buf 
    [out] A buffer for the incoming data. 
    len 
    [in] The length of buf. 
    flags 
    [in] An indicator specifying the way in which the call is made. 
    from 
    [out] An optional pointer to a buffer that will hold the source address upon return. 
    fromlen 
    [in/out] An optional pointer to the size of the from buffer. 
      

  4.   

    应该是缓冲的实际尺寸,recvfrom返回的结果是接收的实际字节数.
      

  5.   

    另外,最后一个参数也有问题,应该是sizeof(addrFrom)
      

  6.   

    To newone2007
       我刚才也看了这个,可是我还是不知道该怎么设置,因为后面还要播放语音, 我用了这句话 
           pWaveHdrOut->lpData  = (LPTSTR)theApp.tempBuf;来设置缓存格式
           如果直接定义一个缓冲区的话,因为recvfrom是在一个接收线程里写的,缓冲区又是在OnMM_WOM_OPEN(UINT wParam, LONG lParam)这个消息里设置的,所以我就不知道该怎么办了,可否指点一二呢?呵呵!
        我得编程能力很不好,接触VC也不久,问得问题如果太没水准的话请不要介意哦!
       
      

  7.   

    CHAR buf[2048];
    int nLen = sizeof(addrFrom);retval = recvfrom(sock,(char*)theApp.tempBuf, 2048, 0,(SOCKADDR*)&addrFrom, &nLen);
      

  8.   

    最后一个参数应该是没有问题的,它是这样设置的:
            SOCKADDR_IN addrFrom;
    int len=sizeof(SOCKADDR);
    应该和你说的是一样的。
      

  9.   

    newone2007:
      上面你设置了一个buf[2048],怎么在recvfrom里没有用到呢? 
        我自己也这样设置了一个buffer,可以接收到数据了,可是这时在这个接收线程里使用的buffer,在消息处理OnMM_WOM_OPEN中不能调用啊?是不是还得它再赋值给全局的变量theApp.tempBuf呢?两个缓冲区的赋值又该怎么赋呢?谢谢...
      

  10.   

    memcpy 就可以进行两块数据的复制.你播放是用一个线程, 也可以自定义线程消息的方式,把音频数据的指针传给线程,线程播放完毕,释放分配的内存. 我建议的方法是:
    1)动态分配一块内存;
    2)接收数据;
    3)通过消息把数据指针传递给音频播放线程;
    4)音频播放线程播放完毕,释放分配的内存.