TDBOOL CSoundControlDlg::STBCreatUDPSocket()
{
   #define BUFLEN 128
struct sockaddr_in myaddr;
char recmsg[BUFLEN + 1];
unsigned int socklen; char strBroadIP[16];
char strTmpIP[16];
char* pDest;
int i = 0;
if(pthreadGetCommd == 1)
{
TDDebug("closesocket\n");
closesocket(hUDPCmdSocket);
}
memset(strBroadIP,0,strlen(strBroadIP));
strcpy(strBroadIP,m_szRoomIP);
for(i = 0; i < 3; i ++)
{
pDest = strstr(strBroadIP,".");
strcpy(strBroadIP,strBroadIP + (pDest - strBroadIP) + 1);
}
sprintf(strTmpIP,"232.0.0.%s",strBroadIP);
TDDebug(strTmpIP);
sprintf(strTmpIP,"232.0.0.185");    hUDPCmdSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (hUDPCmdSocket < 0)
{
 TDDebug("socket creating error\n");
exit(1);
}
socklen = sizeof(struct sockaddr_in);  memset(&mUDPCmdAddr, 0, socklen);
mUDPCmdAddr.sin_family = AF_INET;
mUDPCmdAddr.sin_port = htons(2008);
    if (inet_pton(AF_INET, strTmpIP, &mUDPCmdAddr.sin_addr) <= 0)
{
 TDDebug("wrong group address!\n");
exit(0);
}
    memset(&myaddr, 0, socklen);
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(2009);
if (inet_pton(AF_INET, m_szMyIP, &myaddr.sin_addr) <= 0)
{
 TDDebug("self ip address error!\n");
exit(0);
}
if (bind(hUDPCmdSocket, (struct sockaddr *) &myaddr,
 sizeof(struct sockaddr_in)) == -1)
{
 TDDebug("Bind error\n");
exit(0);
}
 TDDebug("create socket ok \n");
}

解决方案 »

  1.   

    TDBOOL CSoundControlDlg::STBCreatUDPSocket() 

      #define BUFLEN 128 
    struct sockaddr_in myaddr; 
    char recmsg[BUFLEN + 1]; 
    unsigned int socklen; char strBroadIP[16]; 
    char strTmpIP[16]; 
    char* pDest; 
    int i = 0; 
    //这个变量从哪里来的,没找打声明的地方
    if(pthreadGetCommd == 1) 

    TDDebug("closesocket\n"); 
    closesocket(hUDPCmdSocket); 

    memset(strBroadIP,0,strlen(strBroadIP)); //初始化
    strcpy(strBroadIP,m_szRoomIP); //取ip
    for(i = 0; i < 3; i ++) 

    pDest = strstr(strBroadIP,"."); 
    strcpy(strBroadIP,strBroadIP + (pDest - strBroadIP) + 1); 

    sprintf(strTmpIP,"232.0.0.%s",strBroadIP); 
    TDDebug(strTmpIP); 
    sprintf(strTmpIP,"232.0.0.185");   hUDPCmdSocket = socket(AF_INET, SOCK_DGRAM, 0); //创建socket
    if (hUDPCmdSocket < 0) 

    TDDebug("socket creating error\n"); 
    exit(1); 

    socklen = sizeof(struct sockaddr_in); memset(&mUDPCmdAddr, 0, socklen); 
    mUDPCmdAddr.sin_family = AF_INET; 
    mUDPCmdAddr.sin_port = htons(2008); 
        if (inet_pton(AF_INET, strTmpIP, &mUDPCmdAddr.sin_addr) <= 0) 

    TDDebug("wrong group address!\n"); 
    exit(0); 

        memset(&myaddr, 0, socklen); 
    myaddr.sin_family = AF_INET; 
    myaddr.sin_port = htons(2009); 
    if (inet_pton(AF_INET, m_szMyIP, &myaddr.sin_addr) <= 0) 

    TDDebug("self ip address error!\n"); 
    exit(0); 

    if (bind(hUDPCmdSocket, (struct sockaddr *) &myaddr, //绑定
    sizeof(struct sockaddr_in)) == -1) 

    TDDebug("Bind error\n"); 
    exit(0); 

    TDDebug("create socket ok \n"); 
    }
      

  2.   

    TDBOOL CSoundControlDlg::STBCreatUDPSocket() 

    #define BUFLEN 128 
    struct sockaddr_in myaddr; 
    char recmsg[BUFLEN + 1]; 
    unsigned int socklen; 

    char strBroadIP[16]; 
    char strTmpIP[16]; 
    char* pDest; 
    int i = 0; 
    if(pthreadGetCommd == 1) 

    TDDebug("closesocket\n"); 
    closesocket(hUDPCmdSocket); 
    }
    //取得IP地址
    memset(strBroadIP,0,strlen(strBroadIP)); 
    strcpy(strBroadIP,m_szRoomIP); 
    for(i = 0; i < 3; i ++) 

    pDest = strstr(strBroadIP,"."); 
    strcpy(strBroadIP,strBroadIP + (pDest - strBroadIP) + 1); 

    sprintf(strTmpIP,"232.0.0.%s",strBroadIP); 
    TDDebug(strTmpIP); 
    //ip地址是232.0.0.185,上面的ip没有用啊?
    sprintf(strTmpIP,"232.0.0.185"); 
    //创建socket
    hUDPCmdSocket = socket(AF_INET, SOCK_DGRAM, 0); 
    if (hUDPCmdSocket < 0) 

    TDDebug("socket creating error\n"); 
    exit(1); 

    socklen = sizeof(struct sockaddr_in); 

    //设置端口,ip等
    memset(&mUDPCmdAddr, 0, socklen); 
    mUDPCmdAddr.sin_family = AF_INET; 
    mUDPCmdAddr.sin_port = htons(2008); 
     //转换为网络字节序
    if (inet_pton(AF_INET, strTmpIP, &mUDPCmdAddr.sin_addr) <= 0) 

    TDDebug("wrong group address!\n"); 
    exit(0); 
    } //****上面的这个地址没用到啊?
        memset(&myaddr, 0, socklen); 
    myaddr.sin_family = AF_INET; 
    myaddr.sin_port = htons(2009); 
    if (inet_pton(AF_INET, m_szMyIP, &myaddr.sin_addr) <= 0) 

    TDDebug("self ip address error!\n"); 
    exit(0); 
    }
    //将hUDPCmdSocket绑定到m_szMyIP的2009端口
    if (bind(hUDPCmdSocket, (struct sockaddr *) &myaddr, 
    sizeof(struct sockaddr_in)) == -1) 

    TDDebug("Bind error\n"); 
    exit(0); 

    TDDebug("create socket ok \n"); 
    }
      

  3.   

    我也没找到pthreadGetCommd他声明的地方。m_szRoomIP这个是我主机的IP么???我想连接的客户端的IP在哪加呢??
      

  4.   

    等于说 strTmpIP是我主机的IP,我用他广播是么? 
      

  5.   

    udp是不需要连接的,你只要知道对方接受的ip,端口,把数据发过去!
    至于能不能收到,就不是udp的问题了!
      

  6.   

    看你上面的代码,m_szRoomIP如果是你的主机的ip地址的话,
    你只是吧一个socket绑定到你自己的2009端口上了
    如果别的机器,通过2009端口,给你发送消息,你可以用这个socket接受信息。
      

  7.   

    sprintf(strTmpIP,"232.0.0.185"); 
    是说这个是对方的IP么??????
      

  8.   

    在上面得程序中,你这个地址就没有啥作用!
    对于udp的客户端、服务器来说,socket的使用,非常简单!这是孙鑫笔记上的udp套接字使用的说明:
    UDP型套接字。
    服务器端(接收端)程序:
    1、创建套接字(socket)。 
    2、将套接字绑定到一个本地地址和端口上(bind)。
    3、等待接收数据(recvfrom)。
    4、关闭套接字。
    客户端(发送端)程序:
    1、创建套接字(socket)。 
    2、向服务器发送数据(sendto)。
    3、关闭套接字。你上面的这段代码,只是将一个socket绑定到了2009端口上!
    既不能发数据,也不能接受数据!
    只是创建了一个socket,并把它绑定到一个端口上,在什么也没有了!
      

  9.   

    m_szMyIP  是我的主机地址吧,strTmpIP  这个是客户端的IP吧。
      

  10.   

    哦 ,,如果这样的话,是把他的IP绑到我的2009端口上么。我后面的程序没有在用于建立UDP的部分了。。
    BOOL CSoundControlDlg::STBSendInfo(int nCmdType, int nCmdParam)
    {
        char        cmdbuf[2048] = "";
    TDCHAR szMediaName[64];
    TDCHAR szActorName[16];
    TDDWORD dwMediaID = -1;
    BYTE btMediaType = 0;
    int btMediaGroup;
    char szRingID[28];
    int process  = 0;
    switch(nCmdType)
    {
    case PLAYPERCENT:
    if(nCmdParam < 100)
    {
    sprintf(cmdbuf,"%2d:PERCENT:%d",nCmdType,nCmdParam);
    myprintf("cmdBuf = %s\n",cmdbuf);
    STBSendUDPMsg(cmdbuf);
    }
    break;
    case NEXT:
    sprintf(cmdbuf,"%2d: ClientID:%d",NEXT,0);
    STBSendUDPMsg(cmdbuf);
    break;
    case PAUSEPLAY:
    sprintf(cmdbuf,"%2d: ClientID:%d",PAUSEPLAY,0);
    STBSendUDPMsg(cmdbuf);
    break;
    case MUTESOUND:
    sprintf(cmdbuf,"%2d:ClientID:%d",MUTESOUND,0);
    STBSendUDPMsg(cmdbuf);
    break;
    case REPLAY:
    sprintf(cmdbuf,"%2d:ClientID:%d",REPLAY,0);
    STBSendUDPMsg(cmdbuf);
    break;
    case YUANBANDAO:
    sprintf(cmdbuf,"%2d:ClientID:%d",YUANBANDAO,0);
    STBSendUDPMsg(cmdbuf);
    break;
    case MODIFYVOL:
    sprintf(cmdbuf,"%2d:ModfiyType:%d ClientID:%d",MODIFYVOL,nCmdParam,0);
    STBSendUDPMsg(cmdbuf);
    break;
    case MODIFYMIC:
    sprintf(cmdbuf,"%2d:ModfiyType:%d ClientID:%d",MODIFYMIC,nCmdParam,0);
    STBSendUDPMsg(cmdbuf);
    break;
    case MODIFYTONE:
    sprintf(cmdbuf,"%2d:ToneType:%d ClientID:%d",MODIFYTONE,nCmdParam,0);
    STBSendUDPMsg(cmdbuf);
    break;
    case GETSONGLIST:
    sprintf(cmdbuf,"%2d: ClientID:%d",GETSONGLIST,nCmdParam,0);
    STBSendUDPMsg(cmdbuf);
    break;
    case GETCURSONG:
    break;
    case CALLSERVICE:
    {//参数nCallType 呼叫格式  1常规呼叫 2保洁 3音控 4服务 5经理
    sprintf(cmdbuf,"%2d:CallType:%d ClientID:%d",CALLSERVICE,nCmdParam,0);
    STBSendUDPMsg(cmdbuf);
    }
    break;
    case HUNYIN:
    sprintf(cmdbuf,"%2d:HunYinType:%d ClientID:%d",HUNYIN,nCmdParam,0);
    STBSendUDPMsg(cmdbuf);
    break;
    case XIAOGUO:
    sprintf(cmdbuf,"%2d:XiaoGuoType:%d ClientID:%d",XIAOGUO,nCmdParam,0);
    STBSendUDPMsg(cmdbuf);
    break;
    case BROADCAST:
    sprintf(cmdbuf,"%2d:BroadCast:%d ClientID:%d",BROADCAST,nCmdParam,0);
    STBSendUDPMsg(cmdbuf);
    break;
    case RECORD:
    sprintf(cmdbuf,"%2d:Record:%d ClientID:%d",RECORD,nCmdParam,0);
    // printf(cmdbuf);
    // printf("\n");
    STBSendUDPMsg(cmdbuf);
    break;
    case CLOSEROOMCMD:
    sprintf(cmdbuf,"%2d:ClientID:%d",nCmdType,0);
    // STBSendUDPMsg(cmdbuf);
    STBSendUDPMsg(cmdbuf); //msl
    break;
    }
    myprintf("cmd = %s\r\n",cmdbuf);
    }
      

  11.   

    这个是发送的实现
    STBSendUDPMsg(char *service)
    {
    TDDebug("send to stb begin\r\n"); //add by jzn, for test
        if(sendto(hUDPCmdSocket, service, strlen(service)+1, 0, (struct sockaddr *)&mUDPCmdAddr, sizeof(struct sockaddr_in)) < 0)
    {
    // TDDebug("Send service's data error...\n");
    //  TDDebug("Send service's data error...\n");
    MessageBox("Send service's data error...","错误",MB_ICONERROR);
    }
    // TDDebug("send to stb end\r\n"); //add by jzn, for test
           MessageBox("send to stb end","错误",MB_ICONERROR); return TRUE;}
      

  12.   

    这样看的话,就应该是发数据发送到sprintf(strTmpIP,"232.0.0.185")的2008端口!程序中绑定到m_szMyIP的2009端口,应该是用来接受别的地方发送回来的数据!如果一个udp的socket只用来发送数据的话,是不需要绑定的!
      

  13.   

    udp的广播,是向255.255.255.255的某个端口发送数据!
    转换网络字节序是用 INADDR_BROADCAST就可以了!
      

  14.   

    明白一点了,我的程序要通过UDP 来控制外部的设备。
    TDBOOL CSoundControlDlg::STBCreatUDPSocket()
    我要在这个函数里带上我要绑定的客户端IP当参数。在主函数里找到我自己的IP,已实现初始化吧。