CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  网络通信

想学网络编程应该看哪方面的书?

楼主zws101(刚云)2001-07-02 19:03:51 在 专题开发/技术/项目 / 网络通信 提问

小弟想学习网络编程,但感觉不知道从哪里下手。  
  敢问各位大虾该看哪些书?大家能否推荐一下,让我们这些菜鸟能走少一点弯路。  
  小弟先谢了(最好能有电子版的) 问题点数:40、回复次数:10Top

1 楼zws101(刚云)回复于 2001-07-02 19:35:56 得分 0

好可怜,菜鸟没人帮。555555555Top

2 楼wwwunix(木易)回复于 2001-07-02 21:41:22 得分 0

建议先看看tcp/ip的入门教材(这类书很多,随便找一本就行了),然后再看《UNIX网络编程》《用TCP/IP进行网际互联》(三卷)和《TCP/IP详解》(三卷)   Top

3 楼game_boy(gamesboy)回复于 2001-07-03 08:59:20 得分 0

網絡編程開始就看關於socket之類的,《用TCP/IP进行网际互联》(三卷)和《TCP/IP详解》(三卷)   根本不用全看的,就是看也只看卷一,一般很少能用到看卷二,又不是重新架構tcp/ip.  
  《UNIX网络编程》和《   WINDOWS网络编程》很好,找來看看.  
  Top

4 楼kiko_lee(清醒的迷茫中)回复于 2001-07-03 10:20:22 得分 10

要是用vc的话,直接看msdn,一边看,一边自己写点程序,还有到网上去down其他人的程序看看,很多收获的。要是不懂了,可以到csdn上面来问啊。Top

5 楼zws101(刚云)回复于 2001-07-03 11:49:50 得分 0

to   wwwunix   and   game_boy:  
  你们说的那几本书有电子版的吗?哪里有得下载?  
  Top

6 楼wwwunix(木易)回复于 2001-07-03 12:10:01 得分 10

这样的经典书为什么不买下来呢Top

7 楼game_boy(gamesboy)回复于 2001-07-03 13:04:55 得分 10

呵呵,還是買來的好,電子版的看起來不爽,而且這幾本書真是經典Top

8 楼ciml(镜子)回复于 2001-07-03 14:05:22 得分 0

《Windows   网络编程技术》Top

9 楼caiyi9000(小猫)回复于 2001-07-03 14:11:26 得分 10

建议你从Winsock   AIP和Windows多线程编程开始学。  
          用Winsock   API做一个小服务器和客户端试试。  
          为了简单起见,应用程序是基于MFC的标准对话框。  
          Winsock用WINDOWS   API实现:  
                  (1)服务器端有两个线程:  
                  主线程   —   你需要编写以下函数来实现  
   
                  #define   NETWORK_EVENT       USER_MESSAGE+100       //定义网络事件  
                  sockaddr_in       clientaddr;   //暂时存放客户端IP地址  
                   
                  //自己定义消息映射函数,将上面定义的网络事件映射到处理函数  
                  //OnNetEvent为网络事件处理函数,它在下面定义  
                  ON_MESSAGE(NETWORK_EVENT,   OnNetEvent);      
   
                  在你对话框中的初始化函数中调用下面的初始化网络的子函数  
                  BOOL   InitNetwork()         //初始化网络  
                  {  
                          //初始化TCP协议  
                          BOOL   ret   =   WSAStartup(MAKEWORD(2,2),   &wsaData);  
        if(ret   !=   0)  
    {  
                  MessageBox("初始化套接字失败!");  
            return   FALSE;  
    }  
   
                          //创建服务器端套接字  
                          SOCKET   serverSocket    
                                        =   socket(AF_INET,   SOCK_STREAM,   IPPROTO_TCP);  
                          if(serverSocket   ==   INVALID_SOCKET)  
    {  
  MessageBox("创建套接字失败!");  
  closesocket(m_Socket);  
  WSACleanup();  
  return   FALSE;  
    }  
   
                        //绑定到本地一个端口上  
                        sockaddr_in   localaddr;  
  localaddr.sin_family   =   AF_INET;  
  localaddr.sin_port   =   htons(1688);  
  localaddr.sin_addr.s_addr   =   0;  
                        if(bind(serverSocket   ,(const   struct   sockaddr*)&localaddr,      
                                        sizeof(sockaddr))   ==   SOCKET_ERROR)  
  {  
  MessageBox("绑定地址失败!");  
  closesocket(m_Socket);  
  WSACleanup();  
  return   FALSE;  
  }  
   
                      //注册网络异步事件,m_hWnd为应用程序的主对话框或主窗口的句柄  
                      WSAAsyncSelect(serverSocket,   m_hWnd,   NETWORK_EVENT,    
                                      FD_ACCEPT   |   FD_CLOSE   |   FD_READ   |   FD_WRITE);    
   
                          listen(serverSocket,   5);   //设置侦听模式  
     
                          return   TRUE;  
                  }  
   
                  //定义网络事件的响应函数  
                  void   OnNetEvent(WPARAM   wParam,   LPARAM   lParam)  
                  {  
                        //调用API函数,得到网络事件类型  
                        int   iEvent   =   WSAGETSELECTEVENT(lParam);    
                       
                        //得到发出此事件的客户端套接字  
                        SOCKET   pSock   =   (SOCKET)wParam;    
   
                        switch(iEvent)  
                        {  
                        case   FD_ACCEPT:   //客户端连接请求  
                            {  
                                  OnAccept();  
   
                                  break;  
                            }  
                        case   FD_CLOSE:     //客户端断开事件:  
                            {  
                                  OnClose(pSock);  
                                  break;  
                            }  
                        case   FD_READ:       //网络数据包到达事件  
                            {  
                                  OnReceive(pSock);  
                                  break;  
                            }  
        case   FD_WRITE:     //发送网络数据事件  
            {  
                                  OnSend(pSock);  
                  break;  
                            }  
            default:   break;  
                        }  
                  }  
   
                  void   OnAccept(SOCET   pSock)     //响应客户端连接请求函数  
                  {    
                        int   len   =   sizeof(sockaddr);  
   
                        //调用API函数,接受连接,并返回一个新套接字  
                        //还可以获得客户端的IP地址  
                        SOCKET   clientSocket   =   accept(serverSocket,  
                                              (struct   sockaddr*)&clientaddr,   &len);  
   
                        //为新的socket注册异步事件,注意没有Accept事件  
                        if(WSAAsyncSelect(clientSocket   ,m_hWnd,   IP_EVENT,  
                                      FD_CLOSE   |   FD_READ   |   FD_WRITE)   ==   SOCKET_ERROR)  
  {  
                  MessageBox("注册异步事件失败!");  
                  return;  
  }  
     
                      //自编函数,将此客户端的相关信息保存下来:套接字、  
                        //   IP地址、登陆时间                          
                        saveClientSocket(clientSocket,clientAddr,currentTimer);  
                  }  
   
                  void   OnClose(SOCET   pSock)  
                  {  
                    //自编函数,结束与相应的客户端的通信,释放相应资源并做相应处理  
                        endClientSocket(pSock);    
                  }  
   
                  void   OnSend(SOCET   pSock)  
                  {  
                        //自编函数,在给客户端发数据时做一些预处理  
                        handleOnSend(pSock);    
                  }  
   
                  void   OnReceive(SOCET   pSock)  
                  {  
                        recv(...);                 //调用API函数,读出网络缓冲区中的数据包  
   
                        //自编函数,将此数据包和发出此数据的客户端  
                        //clientSocket封装成一条网络消息  
                        buildNetMsg(...);    
   
                        //自编函数,将此网络消息放入一个消息队列中,由工作线程去处理  
                        saveNetMsg(...);      
                        SetEvent(...);         //用事件对象触发工作线程  
                  }                  
                   
                  客户端登陆后,随即把自己的计算机名发给服务器,服务器接到后,把它保存下来。这样服务器就可以显示所有在线客户端的信息了,包括:客户端计算机名、IP地址、登陆时间等。  
                   
                  注意:   客户端没有OnAccept()函数,但有OnConnect()函数。  
   
                  工作线程   —    
                  在你的应用程序初始化时,创建并启动一个工作线程  
   
                  AfxBeginThread(WorkThread,this,THREAD_PRIORITY_NORMAL);  
                  //this可能为应用程序的主对话框或主窗口的句柄  
   
                  UINT   WorkThread(LPVOID   pParam)  
                  {          
                          while(1)  
                        {                
                              //等待多重事件到来    
                              int   ret   =   WaitForMultipleObject(...);        
                 
                              switch(ret)  
                              {  
                              case   OBJECT_0:  
                                  {        
                                        if(bNewNetMsg)   //查看网络消息队列是否有新的网络消息  
                                        {  
                                              readNetMsg(...);         //如有新的网络消息,则读出  
                                              handleNetMsg(...);     //处理此网络消息  
                                        }  
                                        break;  
                                  }  
                              case   OBJECT_0   +   1:  
                                  {  
                                        //做退出处理  
                                        break;  
                                  }  
                              default:   break;  
                        }  
   
                        return   0;  
                  }  
                     
          客户端为单线程,登陆服务器时,用connect()函数给服务器发连接请求;  
                          客户端没有OnAccept()函数,但有OnConnect()函数。  
                          在OnConnect()函数里做发连接请求时的预处理;  
                          在OnReceive()函数里响应并处理网络数据;  
                          在OnClose()函数里响应服务器的关闭事件;  
                          在OnSend()函数里做发数据时的预处理;  
   
          如果你还想实现各客户端之间的在线交流(即所谓的聊天室),你在客户端还可以基于UDP协议  
  再做一套多点对多点的局域网组播模型模型,以后在和你聊,你先把上面的程序实现。  
                     
          以上的I/O异步模型基于Windows的消息机制,另外还可以用事件模型、重叠模型或完成端口模型,  
          建议你参考Windows网络编程指南之类的书。  
   
          如果你能对上面的机制很熟练,你肯定已经对Winsock编网络程序的机制有一定理解,接下来你可以进行更精彩的编程,   不仅可以在网上传输普通数据,而且还  
  以传输语音、视频数据,你还可以自己做一个聊天室,和你的同学在实验室的局域网里可以共同分享你的成果。Top

10 楼zws101(刚云)回复于 2001-07-03 18:31:19 得分 0

感谢大家的热心!以后有问题再请教!  
  再次感谢。Top

相关问题

  • 有没有COM编程方面的书?
  • 请推荐GDI编程方面的书
  • 谁能推荐几本关于IE编程和Shell编程方面的书呀?
  • 请推荐机本网络编程方面入门的书级最好源代码用c(sdk),c++(vc)写的?不知网络编程应该从什么方面入手,很迷盲!!!,谢谢
  • 谁有MySQL编程方面的电子书籍?
  • 关于vc++游戏编程方面的书,介绍几本
  • 哪里有down windowsAPI 编程方面的书啊。
  • 谁有DELPHI串口通信编程方面的书籍……
  • WINDOWS网络编程方面有什么好书值得看呢?
  • 请推荐一本vc++网络编程方面的好书

关键词

  • tcp/ip
  • 函数
  • 服务器
  • 客户
  • 网络
  • 线程
  • 应用程序
  • 消息
  • winsock
  • 数据

得分解答快速导航

  • 帖主:zws101
  • kiko_lee
  • wwwunix
  • game_boy
  • caiyi9000

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo