在MSDN理有一对例子程序(Server/Client),
先拿来看看,感觉一下!

解决方案 »

  1.   

    我认为最好的方法是自己做程序
    先看看windows网络编程一类的书
    再参考一些例子做一个程序,
    一定要自己敲入程序,不要拷贝例子
    这样会使印象很深刻
      

  2.   

    既然是这样:
    那拜托帮帮忙,讨论讨论
    http://www.csdn.net/Expert/topic/452/452350.shtm
    我在学习完成端口例程时遇到的问题,也是跟你同一本书上的
      

  3.   

    请问还有那些是Winsock学习中需要重点研习并掌握的呢?
      

  4.   

    其实非常简单的也!建议你去搞搞SNMP(简单网络协议)
      

  5.   

    SNMP我搞过一点的,不过只是用一点微软的API,没学到什么东西!
      

  6.   

    提个问题:解释TCP的面向流和UDP的面向包的区别?在处理上各有什么特殊注意之处?
    呵呵,对于这个问题,我和另一个高手争论了两天两夜,结果谁也不服谁。直到现在,我才明白他是正确的,我原来的想法是错的。
      

  7.   

    其实也没什么,不要被某些书误导了,其实也就服务器端开个端口,初始化好后进行Listen(),再在client端初始化一个端口,再Connect()过去,server端一旦听到有人要接入就在OnAccept中同意接入,然后就可以通讯了,不过这是tcp的惯用做法,udp的话更简单,直接初始化完后sendto就可以了,找个例子看看,很多的,普通的编程的话不是很复杂,呵呵
      

  8.   

    写UDP程序其实比写TCP成需要麻烦。因为UDP协议本身并不保证传输质量,这就要求写程序的自己处理丢包、顺序、重发、流量控制之类的东西……----------------------------------------------------------------------------------------
    程序员论坛白庄欢迎诸位程序员的光临指导:
    http://www.baizhuang.net/
      

  9.   

    udp一般用于处理声音图像之类的数据,丢个一两包不影响人的听觉和视觉。
    而tcp却像一根管子一样,数据源源不断的流过来,不知道头和尾.
      

  10.   

     用WINSOCK控件建立程序还是很简单的,不过建立前(特别是由于数据包超过8K,C/S之间需要多次通讯时)必须首先考虑是速度优先(UDP)还是稳定优先(TCP),最主要就是建立一个完整的通讯协议(就是信息的含义):怎么发出请求,怎么应答,怎么结束连接。深入以后还再考虑处理数据丢失:如何判断超时,要求重发,重发。等协议完成后再动手编程,这样C/S端就可以分开编写,SERVER端要考虑多客户的要求
      

  11.   

    我也是初学者,学winsock之前是否要先学TCP/IP?
      

  12.   

    可以先用vb搞一个demo试一下,用一个winsock控件。我有代码,想要说一声
      

  13.   

    按我下面介绍的方法可轻松入门:    为了简单起见,服务器端和客户端的应用程序均是基于MFC的标准对话框,网络通信部分基于Winsock2 API实现。先做服务器端应用程序。    用MFC向导做一个基于对话框的应用程序SocketSever,注意第三步中不要选上Windwos Sockets选项。
    在做好工程后,创建一个SeverSock,将它设置为异步非阻塞模式,并为它注册各种网络异步事件,然后与
    自定义的网络异步事件联系上,最后还要将它设置为监听模式。在自定义的网络异步事件的回调函数中,你
    可以得到各种网络异步事件,根据它们的类型,做不同的处理。下面将详细介绍如何编写相关代码。    在SocketSeverDlg.h文件的类定义之前增加如下定义:
        #define  NETWORK_EVENT  WM_USER+166  //定义网络事件
        
        SOCKET ServerSock; //服务器端Socket
        在类定义中增加如下定义:
        class CSocketSeverDlg : CDialog
        {
                     …
        public:
             SOCKET ClientSock[CLNT_MAX_NUM]; //存储用与客户端通信的Socket的数组         /*各种网络异步事件的处理函数*/
           void OnClose(SOCKET CurSock);   //对端Socket断开
           void OnSend(SOCKET CurSock);   //发送网络数据包
           void OnReceive(SOCKET CurSock); //网络数据包到达
           void OnAccept(SOCKET CurSock);  //客户端连接请求       BOOL InitNetwork();  //初始化网络函数
             void OnNetEvent(WPARAM wParam, LPARAM lParam); //网络异步事件回调函数
                    …
        };
            
        在SocketSeverDlg.cpp文件中增加消息映射,其中OnNetEvent是异步事件回调函数名:
                   ON_MESSAGE(NETWORK_EVENT,OnNetEvent)
        定义初始化网络函数,在SocketSeverDlg.cpp文件的OnInitDialog()中调此函数即可。
        BOOL CSocketSeverDlg::InitNetwork()
        {
       WSADATA wsaData;    //初始化TCP协议
       BOOL ret = WSAStartup(MAKEWORD(2,2), &wsaData);
       if(ret != 0)
       {
            MessageBox("初始化网络协议失败!");
       return FALSE;
       }     //创建服务器端套接字
               ServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
       if(ServerSock == INVALID_SOCKET)
       {
          MessageBox("创建套接字失败!");
        closesocket(ServerSock);
        WSACleanup();
          return FALSE;
               }       //绑定到本地一个端口上
       sockaddr_in localaddr;
       localaddr.sin_family = AF_INET;
       localaddr.sin_port = htons(8888);  //端口号不要与其他应用程序冲突
       localaddr.sin_addr.s_addr = 0;
         if(bind(ServerSock ,(struct sockaddr*)&localaddr,sizeof(sockaddr)) 
                                              = = SOCKET_ERROR)
       {
       MessageBox("绑定地址失败!");
       closesocket(ServerSock);
       WSACleanup();
       return FALSE;
               }

       //将SeverSock设置为异步非阻塞模式,并为它注册各种网络异步事件,其中m_hWnd       
       //为应用程序的主对话框或主窗口的句柄
           if(WSAAsyncSelect(ServerSock, m_hWnd, NETWORK_EVENT, 
          FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE) == SOCKET_ERROR) 
       {
          MessageBox("注册网络异步事件失败!");
          WSACleanup();
          return FALSE;
               }    listen(ServerSock, 5); //设置侦听模式           return TRUE;
        }    下面定义网络异步事件的回调函数
        void CSocketSeverDlg::OnNetEvent(WPARAM wParam, LPARAM lParam)
        {
            //调用Winsock API函数,得到网络事件类型
            int iEvent = WSAGETSELECTEVENT(lParam); 
              
            //调用Winsock API函数,得到发生此事件的客户端套接字
            SOCKET CurSock= (SOCKET)wParam;         switch(iEvent)
            {
            case FD_ACCEPT:      //客户端连接请求事件
                    OnAccept(CurSock);
                    break;
            case FD_CLOSE:       //客户端断开事件:
                    OnClose(CurSock);
                    break;
            case FD_READ:        //网络数据包到达事件
                    OnReceive(CurSock);
                    break;
             case FD_WRITE:      //发送网络数据事件
                    OnSend(CurSock);
                    break;
             default: break;
             }
        }
        
        以下是发生在相应Socket上的各种网络异步事件的处理函数,其中OnAccept传进来的参数是服务器端创建的套接字,OnClose()、OnReceive()和OnSend()传进来的参数均是服务器端在接受客户端连接时新创建的用与此客户端通信的Socket。
        void CSocketSeverDlg::OnAccept(SOCKET CurSock)
        {
             //接受连接请求,并保存与发起连接请求的客户端进行通信Socket
     //为新的socket注册异步事件,注意没有Accept事件
        }
     
        void CSocketSeverDlg::OnClose(SOCET CurSock)
        {
            //结束与相应的客户端的通信,释放相应资源
        }    void CSocketSeverDlg::OnSend(SOCET CurSock)
        {
            //在给客户端发数据时做相关预处理
        }    void CSocketSeverDlg::OnReceive(SOCET CurSock)
        {
            //读出网络缓冲区中的数据包
        }        
            
        用同样的方法建立一个客户端应用程序。初始化网络部分,不需要将套接字设置为监听模式。
    注册异步事件时,没有FD_ACCEPT,但增加了FD_CONNECT事件,因此没有OnAccept()函数,但增加
    了OnConnect()函数。向服务器发出连接请求时,使用connect()函数,连接成功后,会响应到
    OnConnect()函数中。下面是OnConnect()函数的定义,传进来的参数是客户端Socket和服务器端发
    回来的连接是否成功的标志。    void CSocketClntDlg::OnConnect(SOCKET CurSock, int error)
        {
    if(0 = = error)
    {
         if(CurSock = = ClntSock)
      MessageBox("连接服务器成功!");
            }
        }    定义OnReceive()函数,处理网络数据到达事件;
        定义OnSend()函数,处理发送网络数据事件;
        定义OnClose()函数,处理服务器的关闭事件。
                
        以上就是用基于Windows消息机制的异步I/O模型做服务器和客户端应用程序的基本方法。另外还
    可以用事件模型、重叠模型或完成端口模型,读者可以参考有关书籍。
        在实现了上面的例子后,你将对Winsock编网络通信程序的机制有了一定的了解。接下来你可以进
    行更精彩的编程, 不仅可以在网上传输普通数据,而且还以传输语音、视频数据,你还可以自己做一个
    网络资源共享的服务器软件,和你的同学在实验室的局域网里可以共同分享你的成果。异步I/O模式还可以用WSAEventSelect()模型,你可以参考我在开发文档中发表的《Winsock开发网络通信程序的经典入门》和《Winsock开发网络通信程序继续-事件I/O模型》2篇文章。
      

  14.   

    推荐一本书:linux网络编程,既有理论又有实践!