使用MFC的CSocket类进行TCP和UDP操作有什么区别,尤其是如何接收固定端口的广播该如何编程,发送UDP广播怎样编程

解决方案 »

  1.   

    http://cs.baylor.edu/~donahoo/practical/CSockets/mfc///multicast using CAsyncSocket/////////////////////// fd_set fds;
    FD_ZERO(&fds);
    FD_SET(m_Socket, &fds);
    struct timeval timeout;
    timeout.tv_sec = m_Timeout;
    timeout.tv_usec = 0;
    switch (select(0, NULL, &fds, NULL, &timeout))
    {
    case SOCKET_ERROR:
    return GetLastErrorCode();
    case 0:
    return ERROR_SOCKET_TIMEOUT;
    } SOCKADDR_IN addr;
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr(255.255.255.255);
    addr.sin_port = htons(9999);
    int send_len = sendto(m_Socket, (char *)buffer, len, 0, (struct sockaddr *)&addr, sizeof(SOCKADDR));
    if (send_len == SOCKET_ERROR || send_len == 0) return GetLastErrorCode(); //////主  题:  在局域网中, 使用 SOCKET编程,如何广播消息??? ///////////////////////////////////////////////////
    //发送端程序   
    #include    <stdio.h  >  
    #include    <winsock.h  >   
    int  main(int  argc,  char*  argv[])  {  
           WSADATA  wsaData;                    //指向WinSocket信息结构的指针  
           SOCKET  sockListener;  
           SOCKADDR_IN  sin,saUdpServ;  
           BOOL  fBroadcast  =  TRUE;  
           char  sendBuff[1024];  
           int  nSize;  
           int  ncount=0;  
           if(WSAStartup(MAKEWORD(  1,  1  ),  &wsaData  )!=0)//进行WinSocket的初始化  
           {  
                   printf(  "Can't  initiates  windows  socket!Program  stop.\n  ");//初始化失败返回-1  
                   return  -1;  
           }  
           sockListener=socket(PF_INET,SOCK_DGRAM,0);  
           setsockopt  (  sockListener,SOL_SOCKET,SO_BROADCAST,  
                   (CHAR  *)&fBroadcast,sizeof  (  BOOL  ));  
     
           sin.sin_family  =  AF_INET;  
           sin.sin_port  =  htons(0);  
           sin.sin_addr.s_addr  =  htonl(INADDR_ANY);  
           if(bind(  sockListener,  (SOCKADDR  *)&sin,  sizeof(sin))!=0)  
           {  
                   printf(  "Can't  bind  socket  to  local  port!Program  stop.\n  ");//初始化失败返回-1  
                   return  -1;  
           }  
           saUdpServ.sin_family  =  AF_INET;  
           saUdpServ.sin_addr.s_addr  =  htonl  (  INADDR_BROADCAST  );  
           saUdpServ.sin_port  =  htons  (7001);//发送用的端口,可以根据需要更改  
           nSize  =  sizeof  (  SOCKADDR_IN  );  
           while(1)  
           {  
                   sprintf(sendBuff,  "Message  %d  ",ncount++);  
                   sendto  (  sockListener,sendBuff,  
                           lstrlen  (sendBuff),  
                           0,  
                           (SOCKADDR  *)  &saUdpServ,  
                           sizeof  (  SOCKADDR_IN  ));  
                   printf(  "%s\n  ",sendBuff);  
           }  
    return  0;  
    }  
    /////////////////////  //接收   
    #include    <stdio.h  >  
    #include    <winsock.h  >  
    #include    <conio.h  >   
    int  main(int  argc,  char*  argv[])  
    {  
           WSADATA  wsaData;                    //指向WinSocket信息结构的指针  
           SOCKET  sockListener;  
           SOCKADDR_IN  sin,saClient;  
           char  cRecvBuff[1024];  
           int  nSize,nbSize;  
           int  iAddrLen=sizeof(saClient);  
           if(WSAStartup(MAKEWORD(  1,  1  ),  &wsaData  )!=0)//进行WinSocket的初始化  
           {  
                   printf(  "Can't  initiates  windows  socket!Program  stop.\n  ");//初始化失败返回-1  
                   return  -1;  
           }  
           sockListener=socket(AF_INET,  SOCK_DGRAM,0);  
           sin.sin_family  =  AF_INET;  
           sin.sin_port  =  htons(7001);//发送端使用的发送端口,可以根据需要更改  
           sin.sin_addr.s_addr  =  htonl(INADDR_ANY);  
           if(bind(  sockListener,  (SOCKADDR  FAR  *)&sin,  sizeof(sin))!=0)  
           {  
                   printf(  "Can't  bind  socket  to  local  port!Program  stop.\n  ");//初始化失败返回-1  
                   return  -1;  
           }  
           while(1)  
           {  
                   nSize  =  sizeof  (  SOCKADDR_IN  );  
                   if((nbSize=recvfrom  (sockListener,cRecvBuff,1024,0,  
                           (SOCKADDR  FAR  *)  &saClient,&nSize))==SOCKET_ERROR)  
                   {  
                           printf(  "Recive  Error  ");  
                           break;  
                   }  
                   cRecvBuff[nbSize]  =  '\0';  
                   printf(  "%s\n  ",cRecvBuff);  
           }  
           return  0;  
    }  
      

  2.   

    广播只有UDP才有的, TCP是点对点的,面向连接的,没有广播。
      

  3.   

    sc
    http://ycjy.jsipt.edu.cn/jsjx/VC/NewUpdate/MFC_CPP/columnist_paper.pl-aid=unicode&pid=6.htm
      

  4.   

    建议看看《计算机网络》,masterz() 太详细了,还是把概念理解了在编程。
      

  5.   

    UDP是面向纪录,面向无连接的,不可靠.若发送可变长度的数据包,会有丢包现象.
    TCP是面向流,面向连接的,很可靠,可以保证数据包顺序的收到,不会有丢包产生.
      

  6.   

    udp是面向无连接的,TCP是面向连接的
    TCP保证数据的可靠传输,一般用于大量数据传输的应用中,每次连接都要确定一条数据链路开销比较大
    而UDP只是尽力发送数据,并不保证对方一定收到(但可自己编程控制),一般用于需要多次传输数据但数据量并不大的应用中,比如QQ,ICQ
    我也在学习网络编程,让我们共同进步,我的e-mail:[email protected]