网络编程学习小结 .

from:http://blog.csdn.net/byxdaz/article/details/4496575

几种网络编程方式:

ISAPICGIWinInetWinsock

它们之间的区别:

1 ISAPI主要是开发基于浏览器客户端与服务器端程序。效率比CGI方式高,而且也扩展了CGI没有的一些功能。(基于TCP/IP模型中的应用层)

2 CGI主要是开发基于浏览器客户端与服务器端程序。(基于TCP/IP模型中的应用层)

3 WinInet主要是开发客户端程序。(基于TCP/IP模型中的应用层)

4 Winsock主要是基于socket来开发客户端与服务器端程序。(基于TCP/IP模型中的各层)要想开发低层协议的程序的话就要了解协议的报文格式。

 

网络基础知识:

网络硬件

数据通讯原理 (详见http://download.csdn.net/source/1196517)

OSI七层网络模型与TCP/IP四层网络模型 (详见http://bbs.51cto.com/topic/thread-396621.html

网络原理和协议 (详见http://www.cnpaf.net/

Winsock

 

网络编程:

建议,把机械工业出版社出的《Windows网络编程技术》看N遍后,再利用MFC或者SDK编写一些小的通信例程,然后编写较大规模的网络程序,最后你就明白了网络编程了!

 

Windows网络编程技术》专门讨论Windows网络编程技术,覆盖Windows 95/98/NT 4/2000/CE平台。内容包括NetBIOSWindows重定向器方法、Winsock方法、客户端远程访问服务器方法。本书论述深入浅出、用大量实例详解了微软网络API函数的应用。

TCP/IP详解,1:协议》是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。

《网络通信编程实用案例精选》是一本介绍利用vlsuaIC++进行网络通信程序开发的书籍。书中精选了大量网络实例,涵盖了本地汁算机网络编程、局域网网络通信编程、IE编程、网络通信协议编程、串口通信编程、代理服务器编程和高级网络通信编程.

RFC文档目录:http://oss.org.cn/man/develop/rfc/default.htm

ACEACE自适配通信环境(ADAPTIVE   Communication   Environment)是可以自由使用、开放源码的面向对象框架,在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++  Wrapper   Facade(包装外观)和框架组件,可跨越多种平台完成常见的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。ACE资料参考:http://docs.huihoo.com/ace_tao/index.html

建议在http://www.codeproject.com/http://www.codeguru.com/网站上找些老外写的网络代码研究研究,最好能参加实际的网络项目,这样能见识更多成熟的网络类库。最好能参加实际的网络项目,这样能见识更多成熟的网络类库。  

 开源网络封装库 :
ACE,ICE,asio,cppsocket,netclass,poco,SimpleSocket,socketman,Sockets
开源下载工具
fdm, eMulePlus,eMule
开源FTP
FileZilla
开源服务器
Apache
网游服务器开源框架
GNE,HawkNL,RakNet,SDL_net

 

网络协议分析软件:

Sniffer工具

Wireshark 开源的经典的协议分析工具Wireshark, http://www.wireshark.org/

WPE -------抓包

Ethereal  -------协议分析
SockMon5  -------抓包及错误分析

 

Windows网络编程细节问题:
    1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:

    BOOL bReuseaddr=TRUE;

  setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof

(BOOL));

    2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:

    BOOL bDontLinger = FALSE;

    setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));

    3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:

  int nNetTimeout=1000;//1秒

  //发送时限

  setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));

  //接收时限

  setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));

    4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:

  // 接收缓冲区

  int nRecvBuf=32*1024;//设置为32K

  setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));

  //发送缓冲区

  int nSendBuf=32*1024;//设置为32K

  setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));

  5. 如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响程序的性能:

  int nZero=0;

  setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));

  6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区):

  int nZero=0;

  setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));

  7.一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:

  BOOL bBroadcast=TRUE;

  setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL));

  8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时,直到accpet()被呼叫(本函数设置只有在非阻塞的过程中有显著的作用,在阻塞的函数调用中作用不大)

  BOOL bConditionalAccept=TRUE;

  setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char*)

&bConditionalAccept,sizeof(BOOL));

  9.如果在发送数据的过程中(send()没有完成,还有数据没发送)而调用了closesocket(),以前我们一般采取的措施是"从容关闭"shutdown(s,SD_BOTH),但是数据是肯定丢失了,如何设置让程序满足具体应用的要求(即让没发完的数据发送出去后在关闭socket)?

  struct linger {

  u_short l_onoff;

  u_short l_linger;

  };

  linger m_sLinger;

  m_sLinger.l_onoff=1;//(在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)

  // 如果m_sLinger.l_onoff=0;则功能和B)作用相同;

  m_sLinger.l_linger=5;//(容许逗留的时间为5秒)

  setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof

(linger));

  注意点:

      A.在设置了逗留延时,用于一个非阻塞的socket是作用不大的,最好不用;

  B.如果想要程序不经历SO_LINGER需要设置SO_DONTLINGER,或者设置l_onoff=0;

  10.一个用的比较少的是在SDI或者是Dialog的程序中,可以记录socket的调试信息:

  BOOL bDebug=TRUE;

  setsockopt(s,SOL_SOCKET,SO_DEBUG,(const char*)&bDebug,sizeof(BOOL));

  11.往往通过setsockopt()设置了缓冲区大小,但还不能满足数据的传输需求,一般习惯是自己写个处理网络缓冲的类,动态分配内存。

    12、#include <Afxsock.h>#include<winsock2.h>冲突问题

解决方法:StdAfx.h 头文件中添加winsock2.h,Afxsock.h

#include <winsock2.h> #include <Afxsock.h>

    13、获取数据包,一般来说想获取数据包可以使用IP_HDRINCL选项,但是在Windows 2000/XPsetsockopt()IP_HDRINCL是个不合法的选项,但是可以使用 WSAIoctl() 函数调用SIO_RCVALL捕获IP数据包。简单步骤如下:
1)
Create a raw socket.
2)
Bind the socket to the local IP over which the traffic is to be sniffed.
3)
WSAIoctl() the socket with SIO_RCVALL to give it sniffing powers.
4)
Put the socket in an infinite loop of recvfrom.
5)
n' joy! the Buffer from recvfrom.

    14IPTCPUDPICMP数据包格式
/*The IP header */
typedef struct tagIPHEADER{
 unsigned char version:4;
 unsigned char header_len:4;
 unsigned char tos;
 unsigned short total_len;
 unsigned short ident;
 unsigned short flags;
 unsigned char ttl;
 unsigned char proto;
 unsigned short checksum;
 unsigned int sourceIP;
 unsigned int destIP;
}IPHEADER;


struct TCPPacketHead{
 WORD SourPort;
 WORD DestPort;
 DWORD SeqNo;
 DWORD AckNo;
 BYTE HLen;
 BYTE Flag;
 WORD WndSize;
 WORD ChkSum;
 WORD UrgPtr;
};

struct ICMPPacketHead {
 BYTE Type;
 BYTE Code;
 WORD ChkSum;
};

struct UDPPacketHead {
 WORD SourPort;
 WORD DestPort;
 WORD Len;
 WORD ChkSum;
};

 

    15、几种winsock I/O模型比较:
select模型核心就是select函数,它可用于判断套接字上是否存在数据,或者能否向一个套接字写入数据。这个
函数可以有效地防止应用程序在套接字处于阻塞模式中时,send或recv进入阻塞状态;同时也可以防止产生大量的WSAEWOULDBLOCK错误select的优势是能够从单个线程的多个套接字上进行多重连接及I/O。

WSAAsyncSelect 模型是以消息机制为基础,能够处理一定的客户连接量,但是扩展性也不是很好。因为消息泵很快就会阻塞,降低了消息处理的速度。WSAAsyncSelect和WSAEventSelect模型提供了读写数据能力的异步通知,但他们不提供异步数据传送,而重叠及完成端口提供异步数据的传送。

WSAEventSelect 模型以时间为基础的网络事件通知,但是与WSAAsyncSelect不同的是,它主要是由事件对象句柄完成的,而不是通过窗口。但是一个线程只能等待64个事件(需要开辟多个线程解决),伸缩性不如完成端口。

重叠模型可以使程序能达到更佳的系统性能。基本设计原理就是让应用程序使用重叠的数据结构,一次投递一个或多个I/O请求。针对这些提交的请求,在他们完成之后,应用程序可为他们提供服务。它又分为两种实现方法:事件通知和完成例程。重叠I/O模型事件通知依赖于等待事件通知的线程数(WSAWaitForMultipleEvents调用的每个线程,该I/O模型一次最多都只能支持6 4个套接字。),处理客户通信时,大量线程上下文的切换是它们共同的制约因素。

完成端口提供了最好的伸缩性,往往可以使系统达到最好的性能,是处理成千上万的套接字的首选。从本质上说,完成端口模型要求创建一个windows完成端口对象,该对象通过指定数量的线程,对重叠I/O请求进行管理,以便为已经完成的重叠I/O请求提供服务。但是完成端口只是支持NT系统、WIN2000系统。

重叠模型和完成端口模型的应用程序通知缓冲区收发系统直接使用数据,也就是说,如果应用程序投递了一个10KB大小的缓冲区来接收数据,且数据已经到达套接字,则该数据将直接被拷贝到投递的缓冲区。 而select模型、WSAAsyncSelect 模型、WSAEventSelect 模型,数据到达并拷贝到单套接字接收缓冲区中,此时应用程序会被告知可以读入的容量。当应用程序调用接收函数之后,数据才从单套接字缓冲区拷贝到应用程序的缓冲区,差别就体现出来了。

 

    16、服务器与客户端IO模型选择

对于如何挑选最适合自己应用程序的I/O模型已经很明晰了。同开发一个简单的运行多线程的锁定模式应用相比,其他每种I/O模型都需要更为复杂的编程工作。因此,针对客户机和服务器应用开发模型的选择,有以下原则。

1). 客户端

若打算开发一个客户机应用,令其同时管理一个或多个套接字,那么建议采用重叠I/O或WSAEventSelect模型

,以便在一定程度上提升性能。然而,假如开发的是一个以Windows为基础的应用程序,要进行窗口消息的管理,那么WSAAsyncSelect模型恐怕是一种最好的选择,因为WSAAsyncSelect本身便是从Windows消息模型借鉴来的。采用这种模型,程序需具备消息处理功能。

2). 服务器端

若开发的是一个服务器应用,要在一个给定的时间,同时控制多个套接字,建议采用重叠I/O模型,这同样是从性能角度考虑的。但是,如果服务器在任何给定的时间,都会为大量I/O请求提供服务,便应考虑使用I/O完成端口模型,从而获得更佳的性能。

    17、shutdownclosesocket区别

shutdown 从容关闭,为了保证通信双方都能够收到应用程序发出的所有数据,一个合格的应用程序的做法是通知接受双发都不在发送数据!这就是所谓的“正常关闭”套接字的方法,而这个方法就是由shutdown函数,传递给它的参数有SD_RECEIVE,SD_SEND,SD_BOTH三种,如果是SD_RECEIVE就表示不允许再对此套接字调用接受函数。这对于协议层没有影响,另外对于tcp套接字来说,无论数据是在等候接受还是即将抵达,都要重置连接(注意对于udp协议来说,仍然接受并排列传入的数据,因此udp套接字而言shutdown毫无意义)。如果选择SE_SEND,则表示不允许再调用发送函数。对于tcp套接字来说,这意味着会在所有数据发送出并得到接受端确认后产生一个FIN包。如果指定SD_BOTH,答案不言而喻。  
closesocket
正式关闭,关闭连接,释放所有相关的资源。因为无连接协议没有连接,所以不会有正式关闭和从容关闭,直接调用closesocket函数。

    18、TCP链接三次握手、终止链接四次握手

 

 

    19、getpeername 、getsockname

getpeername 函数用于获得通信方的套接字地址信息,该信息上关于已建立连接的那个套接字的。
getsockname 函数是getpeername的对应函数。它返回的是指定套接字的本地接口的地址信息。

    20、MFC下CSocket编程注意事项

1)、在使用MFC编写socket程序时,必须要包含<afxsock.h>都文件。
2)、AfxSocketInit() 这个函数,在使用CSocket前一定要先调用该函数,否则使用CSocket会出错。
3)、CSocket::Create 的接口就是, 实现上还执行了 CSocket::Bind , 非常不容易被发现。如果是以 Create 方
法初始化的前提下不能再调用 Bind ,要不一定出错。一般写服务器程序都不要用Create 为好,用下面的

CSocket::Socket 初始化然后Bind。

    21、winsock   有两个不同的版本

winsock   有两个不同的版本,第一版很old了,win95时代的,win2000后推崇第二版winsock   2,   出了主板本号外,还有子版本号,这些功能上有差别,winsock2   支持原始套接字编程,   MFC   还封装了winsock,使用WINSOCK.h   要用到WSOCK32.LIB,   还有一些扩展api功能,需要MSWSOCK.h   MSWSOCK.DLL  。 现在winsock.h   winsock2.h   都用ws2_32.lib。

   22、sockaddr_in , sockaddr , in_addr区别
struct   sockaddr   { 
                unsigned   short   sa_family;    
                char   sa_data[14];    
        }; 
  上面是通用的socket地址,具体到Internet   socket,用下面的结构,二者可以进行类型转换 
        
  struct   sockaddr_in   { 
                short   int   sin_family;    
                unsigned   short   int   sin_port;    
                struct   in_addr   sin_addr;    
                unsigned   char   sin_zero[8];    
        }; 
        struct   in_addr就是32位IP地址。 
        struct   in_addr   { 
                union {
                        struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
                        struct { u_short s_w1,s_w2; } S_un_w;
                        u_long S_addr;
                } S_un;

                #define s_addr  S_un.S_addr
        }; 
   inet_addr()是将一个点分制的IP地址(如192.168.0.1)转换为上述结构中需要的32位IP地址(0xC0A80001)。

填值的时候使用sockaddr_in结构,而作为函数(如socket, listen, bind等)的参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符长。

通常的用法是: 
  int   sockfd; 
  struct   sockaddr_in   my_addr; 
  sockfd   =   socket(AF_INET,   SOCK_STREAM,   0);    
  
  my_addr.sin_family   =   AF_INET;    
  my_addr.sin_port   =   htons(MYPORT);    
  my_addr.sin_addr.s_addr   =   inet_addr("192.168.0.1"); 
  
  bzero(&(my_addr.sin_zero),   8);    
   
  bind(sockfd,   (struct   sockaddr   *)&my_addr,   sizeof(struct   sockaddr));
想来你是要进行网络编程,使用socket, listen, bind等函数。你只要记住,填值的时候使用sockaddr_in结构,而
作为函数的参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符长。 
   23、几个特殊的地址

INADDR_LOOPBACK   (127.0.0.1)   总是代表经由回环设备的本地主机;   INADDR_ANY  

(0.0.0.0)   表示任何可绑定的地址;   INADDR_BROADCAST   (255.255.255.255)   表示任何主机。
INADDR_ANY 的具体含义是,绑定到0.0.0.0。此时,对所有的地址都将是有效的,如果系统考虑冗余,采用
多个网卡的话,那么使用此种bind,将在所有网卡上进行绑定。在这种情况下,你可以收到发送到所有有效地址上数据包。
例如:
SOCKADDR_IN Local;
Local.sin_addr.s_addr = htonl(INADDR_ANY);
另外一种方式如下:
SOCKADDR_IN Local;
hostent* thisHost = gethostbyname("");
char* ip = inet_ntoa(*(struct in_addr *)*thisHost->h_addr_list);
Local.sin_addr.s_addr = inet_addr(ip);
在这种方式下,将在系统中当前第一个可用地址上进行绑定。在多网卡的环境下,可能会出问题。

   24、常见协议

FTP协议:http://blog.csdn.net/superman419/archive/2009/04/10/4063476.aspx
SMTP协议:http://www.cnpaf.net/class/smtp/
POP3协议:http://www.cnpaf.net/class/pop3/
http://www.yesky.com/20020305/1600243.shtml
ICMP协议:http://blog.csdn.net/byxdaz/archive/2007/08/01/1720971.aspx
RAS协议:http://blog.ixpub.net/html/94/10181094-31509.html
TAPI协议:http://blog.csdn.net/chszs/archive/2008/12/08/3475908.aspx
Telnet协议:http://www.cnblogs.com/liuweijian/archive/2005/09/12/235493.html
HTTP协议:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
代理协议socks:http://blog.csdn.net/byxdaz/archive/2010/03/31/5439291.aspx

 25、为什么需要htons(), ntohl(), ntohs(),htons() 函数?
在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题。这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数。

网络字节顺序与本地字节顺序之间的转换函数:

      htonl()--"Host to Network Long"
      ntohl()--"Network to Host Long"
      htons()--"Host to Network Short"
      ntohs()--"Network to Host Short"
 

之所以需要这些函数是因为计算机数据表示存在两种字节顺序:NBO与HBO

网络字节顺序NBO(Network Byte Order):
      按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。

主机字节顺序(HBO,Host Byte Order):
      不同的机器HBO不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。
如 Intel   x86结构下,short型数0x1234表示为34   12, int型数0x12345678表示为78   56   34   12  
如IBM   power PC结构下,short型数0x1234表示为12   34, int型数0x12345678表示为12   34   56   78
由于这个原因不同体系结构的机器之间无法通信,所以要转换成一种约定的数序,也就是网络字节顺序,其实就是如同power   pc那样的顺序 。在PC开发中有ntohl和htonl函数可以用来进行网络字节和主机字节的转换。

26如何查询端口被占用的程序

大家在启动服务器时,有时正常启动有时又启动不了是怎么回事呢??那为什么关掉迅雷等软件就又好了呢??现在就来给大家讲解一下,

 

这些端口如果被其他程序占用就不能正常启动,比如有时启动时会提示WEB启动失败,其实就是80端口被占用了,而迅雷等下载软件恰恰就是占用了80端口,关掉就行了。但有时迅雷等都没有开也启动不了,那就是别的东西占用了,那怎么办呢?我来叫你查看端口并关掉的方法。
1.在开始--运行   里面输入cmd点回车,会出现运行窗口。
2.在提示符后输入netstat -ano回车,找到tcp 80端口对应的pid,比如1484.
3.ctrl+alt+del打开任务管理器,选进程,这里有很多正在运行的程序怎么找?别急点上面的   查看--选择列--PID(进程标示符)前面打钩。好了,下面的进程前面都有了PID号码。这时上一步找到的PID就有用了,找到1484,比如PEER.EXE什么的,结束进程吧。这时再开服务器,看WEB可以启动了!

已标记关键词 清除标记
<p> 这是一门linux下c++通讯架构实战课程,针对c/c++语言已经掌握的很熟并希望进一步深造以将来用c++在linux下从事网络通讯领域/网络服务器的开发和架构工作。<br /> <br /> 这门课程学习难度颇高但也有着极其优渥的薪水(最少30K月薪,最高可达60-80K月薪),这门课程,会先从nginx源码的分析和讲解开始,逐步开始书写属于自己的高性能服务器框架代码,完善个人代码库,这些,将会是您日后能取得高薪的重要筹码。 </p> <p> <br /> </p> <p> <span style="color:#E53333;">本课程原计划带着大家逐行写代码,但因为代码实在过于复杂和精细,带着写代码可能会造成每节课至少要4~5小时的超长时间,所以老师会在课前先写好代码,主要的时间花费在逐行讲解这些代码上,这一点望同学们周知。如果你觉得非要老师领着写代码才行的话,老师会觉得你当前可能学习本门课程会比较吃力,请不要购买本课程,以免听不懂课程并给老师差评,差评也会非常影响老师课程的销售并造成其他同学的误解。</span> </p> <p> <br /> </p> <p> 这门课程要求您具备下面的技能:<br /> (1)对c/c++语言掌握的非常熟练,语言本身已经不是继续学习的障碍,并不要求您一定熟悉网络或者linux;<br /> (2)对网络通讯架构领域有兴趣、勇于挑战这个高难度的开发领域并期望用大量的付出换取高薪;<br /> <br /> 在这门课程中,实现了一个完整的项目,其中包括通讯框架和业务逻辑框架,浓缩总结起来包括如下几点:<br /> (1)项目本身是一个极完整的多线程高并发的服务器程序;<br /> (2)按照包头包体格式正确的接收客户端发送过来的数据包, 完美解决收包时的数据粘包问题;<br /> (3)根据收到的包的不同来执行不同的业务处理逻辑;<br /> (4)把业务处理产生的结果数据包正确返回给客户端;<br /> <br /> 本项目用到的主要开发技术和特色包括:<br /> (1)epoll高并发通讯技术,用到的触发模式是epoll中的水平触发模式【LT】;<br /> (2)自己写了一套线程池来处理业务逻辑,调用适当的业务逻辑处理函数处理业务并返回给客户端处理结果;<br /> (3)线程之间的同步技术包括互斥量,信号量等等;<br /> (4)连接池中连接的延迟回收技术,这是整个项目中的精华技术,极大程度上消除诸多导致服务器程序工作不稳定的因素;<br /> (5)专门处理数据发送的一整套数据发送逻辑以及对应的发送线程;<br /> (6)其他次要技术,包括信号、日志打印、fork()子进程、守护进程等等; </p> <div> <br /> </div>
相关推荐
作者:宋劲杉,PDF 格式,大小 8 Mb。 这是一本从零基础开始学习编程的书,不要求读者有任何编程经验,但读者至少需要具备以下素质: 熟悉Linux系统的基本操作。如果不具备这一点,请先参考其它教材学习Linux系统的基本操作,熟练之后再学习本书,《鸟哥的Linux私房菜》据说是Linux系统管理和应用方面比较好的一本书。但学习本书并不需要会很多系统管理技术,只要会用基本命令,会自己安装系统和软件包就足够了。 具有高中毕业的数学水平。本书会用到高中的数学知识,事实上,如果不具有高中毕业的数学水平,也不必考虑做程序员了。但并不是说只要具有高中毕业的数学水平就足够做程序员了,只能说看这本书应该没有问题,数学是程序员最重要的修养,计算机科学其实就是数学的一个分支,如果你的数学功底很差,日后还需恶补一下。 具有高中毕业的英文水平。理由同上。 对计算机的原理和本质深感兴趣,不是为就业而学习,不是为拿高薪而学习,而是真的感兴趣,想把一切来龙去脉搞得清清楚楚而学习。 勤于思考。本书尽最大努力理清概念之间的依赖关系,力求一站式学习,读者不需要为了找一个概念的定义去翻其它书,也不需要为了搞清楚一个概念在本书中前后一通乱翻,只需从前到后按顺序学习即可。但一站式学习并不等于傻瓜式学习,有些章节有一定的难度,需要积极思考才能领会。本书可以替你节省时间,但不能替你思考,不要指望像看小说一样走马观花看一遍就能学会。 内容预览: 历史 前言 I. C语言入门 1. 程序的基本概念 1. 程序和编程语言 2. 自然语言和形式语言 3. 程序的调试 4. 第一个程序 2. 常量、变量和表达式 1. 继续Hello World 2. 常量 3. 变量 4. 赋值 5. 表达式 6. 字符类型与字符编码 3. 简单函数 1. 数学函数 2. 自定义函数 3. 形参和实参 4. 全局变量、局部变量和作用域 4. 分支语句 1. if语句 2. if/else语句 3. 布尔代数 4. switch语句 5. 深入理解函数 1. return语句 2. 增量式开发 3. 递归 6. 循环语句 1. while语句 2. do/while语句 3. for语句 4. break和continue语句 5. 嵌套循环 6. goto语句和标号 7. 结构体 1. 复合类型与结构体 2. 数据抽象 3. 数据类型标志 4. 嵌套结构体 8. 数组 1. 数组的基本概念 2. 数组应用实例:统计随机数 3. 数组应用实例:直方图 4. 字符串 5. 多维数组 9. 编码风格 1. 缩进和空白 2. 注释 3. 标识符命名 4. 函数 5. indent工具 10. gdb 1. 单步执行和跟踪函数调用 2. 断点 3. 观察点 4. 段错误 11. 排序与查找 1. 算法的概念 2. 插入排序 3. 算法的时间复杂度分析 4. 归并排序 5. 线性查找 6. 折半查找 12. 栈与队列 1. 数据结构的概念 2. 堆栈 3. 深度优先搜索 4. 队列与广度优先搜索 5. 环形队列 13. 本阶段总结 II. C语言本质 14. 计算机中数的表示 1. 为什么计算机用二进制计数 2. 不同进制之间的换算 3. 整数的加减运算 3.1. Sign and Magnitude表示法 3.2. 1's Complement表示法 3.3. 2's Complement表示法 3.4. 有符号数和无符号数 4. 浮点数 15. 数据类型详解 1. 整型 2. 浮点型 3. 类型转换 3.1. Integer Promotion 3.2. Usual Arithmetic Conversion 3.3. 由赋值产生的类型转换 3.4. 强制类型转换 3.5. 编译器如何处理类型转换 16. 运算符详解 1. 位运算 1.1. 按位与、或、异或、取反运算 1.2. 移位运算 1.3. 掩码 1.4. 异或运算的一些特性 2. 其它运算符 2.1. 复合赋值运算符 2.2. 条件运算符 2.3. 逗号运算符 2.4. sizeof运算符与typedef类型声明 3. Side Effect与Sequence Point 4. 运算符总结 17. 计算机体系结构基础 1. 内存与地址 2. CPU 3. 设备 4. MMU 5. Memory Hierarchy 18. x86汇编程序基础 1. 最简单的汇编程序 2. x86的寄存器 3. 第二个汇编程序 4. 寻址方式 5. ELF文件 5.1. 目标文件 5.2. 可执行文件 19. 汇编与C之间的关系 1. 函数调用 2. main函数和启动例程 3. 变量的存储布局 4. 结构体和联合体 5. C内联汇编 6. volatile限定符 20. 链接详解 1. 多目标文件的链接 2. 定义和声明 2.1. extern和static关键字 2.2. 头文件 2.3. 定义和声明的详细规则 3. 静态库 4. 共享库 4.1. 编译、链接、运行 4.2. 动态链接的过程 4.3. 共享库的命名惯例 5. 虚拟内存管理 21. 预处理 1. 预处理的步骤 2. 宏定义 2.1. 函数式宏定义 2.2. 内联函数 2.3. #、##运算符和可变参数 2.4. 宏展开的步骤 3. 条件预处理指示 4. 其它预处理特性 22. Makefile基础 1. 基本规则 2. 隐含规则和模式规则 3. 变量 4. 自动处理头文件的依赖关系 5. 常用的make命令行选项 23. 指针 1. 指针的基本概念 2. 指针类型的参数和返回值 3. 指针与数组 4. 指针与const限定符 5. 指针与结构体 6. 指向指针的指针与指针数组 7. 指向数组的指针与多维数组 8. 函数类型和函数指针类型 9. 不完全类型和复杂声明 24. 函数接口 1. 本章的预备知识 1.1. strcpy与strncpy 1.2. malloc与free 2. 传入参数与传出参数 3. 两层指针的参数 4. 返回值是指针的情况 5. 回调函数 6. 可变参数 25. C标准库 1. 字符串操作函数 1.1. 初始化字符串 1.2. 取字符串的长度 1.3. 拷贝字符串 1.4. 连接字符串 1.5. 比较字符串 1.6. 搜索字符串 1.7. 分割字符串 2. 标准I/O库函数 2.1. 文件的基本概念 2.2. fopen/fclose 2.3. stdin/stdout/stderr 2.4. errno与perror函数 2.5. 以字节为单位的I/O函数 2.6. 操作读写位置的函数 2.7. 以字符串为单位的I/O函数 2.8. 以记录为单位的I/O函数 2.9. 格式化I/O函数 2.10. C标准库的I/O缓冲区 2.11. 本节综合练习 3. 数值字符串转换函数 4. 分配内存的函数 26. 链表、二叉树和哈希表 1. 链表 1.1. 单链表 1.2. 双向链表 1.3. 静态链表 1.4. 本节综合练习 2. 二叉树 2.1. 二叉树的基本概念 2.2. 排序二叉树 3. 哈希表 27. 本阶段总结 III. Linux系统编程 28. 文件与I/O 1. 汇编程序的Hello world 2. C标准I/O库函数与Unbuffered I/O函数 3. open/close 4. read/write 5. lseek 6. fcntl 7. ioctl 8. mmap 29. 文件系统 1. 引言 2. ext2文件系统 2.1. 总体存储布局 2.2. 实例剖析 2.3. 数据块寻址 2.4. 文件和目录操作的系统函数 3. VFS 3.1. 内核数据结构 3.2. dup和dup2函数 30. 进程 1. 引言 2. 环境变量 3. 进程控制 3.1. fork函数 3.2. exec函数 3.3. wait和waitpid函数 4. 进程间通信 4.1. 管道 4.2. 其它IPC机制 5. 练习:实现简单的Shell 31. Shell脚本 1. Shell的历史 2. Shell如何执行命令 2.1. 执行交互式命令 2.2. 执行脚本 3. Shell的基本语法 3.1. 变量 3.2. 文件名代换(Globbing):* ? [] 3.3. 命令代换:`或 $() 3.4. 算术代换:$(()) 3.5. 转义字符\ 3.6. 单引号 3.7. 双引号 4. bash启动脚本 4.1. 作为交互登录Shell启动,或者使用--login参数启动 4.2. 以交互非登录Shell启动 4.3. 非交互启动 4.4. 以sh命令启动 5. Shell脚本语法 5.1. 条件测试:test [ 5.2. if/then/elif/else/fi 5.3. case/esac 5.4. for/do/done 5.5. while/do/done 5.6. 位置参数和特殊变量 5.7. 函数 6. Shell脚本的调试方法 32. 正则表达式 1. 引言 2. 基本语法 3. sed 4. awk 5. 练习:在C语言中使用正则表达式 33. 信号 1. 信号的基本概念 2. 产生信号 2.1. 通过终端按键产生信号 2.2. 调用系统函数向进程发信号 2.3. 由软件条件产生信号 3. 阻塞信号 3.1. 信号在内核中的表示 3.2. 信号集操作函数 3.3. sigprocmask 3.4. sigpending 4. 捕捉信号 4.1. 内核如何实现信号的捕捉 4.2. sigaction 4.3. pause 4.4. 可重入函数 4.5. sig_atomic_t类型与volatile限定符 4.6. 竞态条件与sigsuspend函数 4.7. 关于SIGCHLD信号 34. 终端、作业控制与守护进程 1. 终端 1.1. 终端的基本概念 1.2. 终端登录过程 1.3. 网络登录过程 2. 作业控制 2.1. Session与进程组 2.2. 与作业控制有关的信号 3. 守护进程 35. 线程 1. 线程的概念 2. 线程控制 2.1. 创建线程 2.2. 终止线程 3. 线程间同步 3.1. mutex 3.2. Condition Variable 3.3. Semaphore 3.4. 其它线程间同步机制 4. 编程练习 36. TCP/IP协议基础 1. TCP/IP协议栈与数据包封装 2. 以太网(RFC 894)帧格式 3. ARP数据报格式 4. IP数据报格式 5. IP地址与路由 6. UDP段格式 7. TCP协议 7.1. 段格式 7.2. 通讯时序 7.3. 流量控制 37. socket编程 1. 预备知识 1.1. 网络字节序 1.2. socket地址的数据类型及相关函数 2. 基于TCP协议的网络程序 2.1. 最简单的TCP网络程序 2.2. 错误处理与读写控制 2.3. 把client改为交互式输入 2.4. 使用fork并发处理多个client的请求 2.5. setsockopt 2.6. 使用select 3. 基于UDP协议的网络程序 4. UNIX Domain Socket IPC 5. 练习:实现简单的Web服务器 5.1. 基本HTTP协议 5.2. 执行CGI程序 A. 字符编码 1. ASCII码 2. Unicode和UTF-8 3. 在Linux C编程中使用Unicode和UTF-8 B. GNU Free Documentation License Version 1.3, 3 November 2008 参考书目 索引
◆ 01.htm 1、怎么用mscomm控件检测modem是否与计算机联接正确?2、如何用mscomm挂断modem与别的电话机间的连接?(已接通) <br/>◆ 02.htm CWinInetConnection---一个封装了WinInet API函数的类 <br/>◆ 03.htm MODEM通讯意外处理 <br/>◆ 04.htm MsComm 文字传输 <br/>◆ 05.htm PING一个IP地址(向它发送一个数据包并等待回应) <br/>◆ 06.htm SMTP协议简介 (Simple Mail Transfer Protocol) <br/>◆ 07.htm VB5.0 中远程数据库的访问 <br/>◆ 08.htm VB下如何编写CRC校验程序 <br/>◆ 09.htm VB中Winsock控制的UDP协议的使用 <br/>◆ 10.htm Visual Basic 6中发送邮件的新方法 <br/>◆ 11.htm Visual Basic通信程序设计 <br/>◆ 12.htm Whois 示例程序 <br/>◆ 13.htm Winsock Terminal示例程序 <br/>◆ 14.htm WinSock断开导致客户端问题 <br/>◆ 15.htm 把Outlook信箱中的附件另存为 <br/>◆ 16.htm 保证连网计算机时间同步 <br/>◆ 17.htm 编写网络寻呼机 <br/>◆ 18.htm 编制自已的电话录音小程序 <br/>◆ 19.htm 程序中如何启动默认的拨号连接 <br/>◆ 20.htm 程序中如何启动默认的拨号连接? <br/>◆ 21.htm 打开器并进入指定网址 <br/>◆ 22.htm 打开一个直接到自己主页的器 <br/>◆ 23.htm 得到用户的IP地址 <br/>◆ 24.htm 电话拨号 <br/>◆ 25.htm 电子邮件的标准格式 (RFC 822) <br/>◆ 26.htm 断开拨号网络的连接 <br/>◆ 27.htm 断开与 Internet 的连接 <br/>◆ 28.htm 发送电子邮件附件 <br/>◆ 29.htm 发送电子邮件附件1 <br/>◆ 30.htm 发送电子邮件附件2 <br/>◆ 31.htm 发送电子邮件附件3 <br/>◆ 32.htm 发送电子邮件附件4 <br/>◆ 33.htm 获得用户网络登录名 <br/>◆ 34.htm 基 于Win95 的VB5 串 口 通 信 程 序 <br/>◆ 35.htm 基于Win95的VB5串口通信程序 <br/>◆ 36.htm 几个设置IE的API <br/>◆ 37.htm 检测运程数据传送的断线 <br/>◆ 38.htm 简单的聊天程序 <br/>◆ 39.htm 简单电子邮件发送程序 <br/>◆ 40.htm 建立拨号联接 <br/>◆ 41.htm 将所有窗口最小化 <br/>◆ 42.htm 利用IE控件访问Internet <br/>◆ 43.htm 利用IE控件设计简易器 <br/>◆ 44.htm 利用Mscomm32控件判断MODEM是否打开,或者正在工作,并且判断拨号时是否遇忙音 <br/>◆ 45.htm 利用TAPI进行电话拨号 <br/>◆ 46.htm 利用VB访问Internet <br/>◆ 47.htm 利用VB设计聊天室 <br/>◆ 48.htm 利用Visual Basic实现无线通讯 <br/>◆ 49.htm 利用Winsock控件实现局域网通信 <br/>◆ 50.htm 强制一个本地或远程NT系统关闭 <br/>◆ 51.htm 取得网卡序列号 <br/>◆ 52.htm 如何从 Internet 上取回某一个网页的內容? <br/>◆ 53.htm 如何检测是否已连接到Internet? <br/>◆ 54.htm 如何利用Winsock控件编写自己的Internet程序 <br/>◆ 55.htm 如何每天抓取 Internet 上某一个网页中的图片来更换桌面的壁纸? <br/>◆ 56.htm 如何启动拨号网路中的连线? <br/>◆ 57.htm 如何使用MSCOMM32.OCX发送大于80H的字符,可否给个示例程序 <br/>◆ 58.htm 如何通过VB获取网卡地址 <br/>◆ 59.htm 如何用VB打开默认器或默认发信程序? <br/>◆ 60.htm 如何用Visual Basic编写小型的网络系统 <br/>◆ 61.htm 如何在程序中启动 NT 的【拨号连接】对话框
Unix/Linux 编程实践教程.PDF,作者:Bruce Molay(美),翻译:杨宗源、黄海涛,出版:清华大学出版社。 内容预览: 第一章 Unix 系统编程概述 1.1 介绍 1.2 什么是系统编程 1.2.1 简单的程序模型 1.2.2 系统模型 1.2.3 操作系统的职责 1.2.4 为程序提供服务 1.3 理解系统编程 1.3.1 系统资源 1.3.2 目标:理解系统编程 1.3.3 方法:通过三个问题来理解 1.4 从用户的角度来理解 Unix 1.4.1 Unix 能做些什么 1.4.2 登录-运行程序-注销 1.4.3 目录操作 1.4.4 文件操作 1.5 从系统的角度来看 Unix 1.5.1 用户和程序之间的连接方式 1.5.2 网络桥牌 1.5.3 bc:Unix 的计算器 1.5.4 从 bc/dc 到 Web 1.6 动手实践 1.7 工作步骤和概要图 1.7.1 接下来的工作步骤 1.7.2 Unix 的概要图 1.7.3 Unix 的发展历程 小结 第二章 用户、文件操作与联机帮助:编写 who 命令 2.1 介绍 2.2 关于命令 who 2.3 问题 1:who 命令能做些什么 2.4 问题 2:who 命令是如何工作的 2.5 问题 3:如何编写 who 2.5.1 问题:如何从文件中读取数据结构 2.5.2 答案:使用 open、read 和 close 2.5.3 编写 whol,c 2.5.4 显示登录信息 2.5.5 编写 who2.c 2.5.6 回顾与展望 2.6 编写 cp(读和写) 2.6.1 问题 1:cp 命令能做些什么 2.6.2 问题 2:cp 命令是如何创建/重写文件的 2.6.3 问题 3:如何编写 cp 2.6.4 Unix 编程看起来好像很简单 2.7 提高文件 I/O 效率的方法:使用缓冲 2.7.1 缓冲区的大小对性能的影响 2.7.2 为什么系统调用需要很多时间 2.7.3 低效率的 who2.c 2.7.4 在 who2.c 中运用缓冲技术 2.8 内核缓冲技术 2.9 文件读写 2.9.1 注销过程:做了些什么 2.9.2 注销过程:如何工作的 2.9.3 改变文件的当前位置 2.9.4 编写终端注销的代码 2.10 处理系统调用中的错误 小结 第三章 目录与文件属性:编写 ls 3.1 介绍 3.2 问题 1:ls 命令能做什么 3.2.1 ls 可以列出文件名和文件的属性 3.2.2 列出指定目录或文件的信息 3.2.3 经常用到的命令行选项 3.2.4 问题 1 的答案 3.3 文件树 3.4 问题 2:ls 是如何工作的 3.4.1 什么是目录 3.4.2 是否可以用 open、read 和 close 来操作目录 3.4.3 如何读目录的内容 3.5 问题 3:如何编写 ls 3.6 编写 ls -l 3.6.1 问题 1:ls -l 能做些什么 3.6.2 问题 2:ls -l 是如何工作的 3.6.3 用 stat 得到文件信息 3.6.4 stat 提供的其他信息 3.6.5 如何实现 3.6.6 将模式字段转换成字符 3.6.7 将用户/组 ID 转换成字符串 3.6.8 编写 ls2.c 3.7 三个特殊的位 3.7.1 set-user-ID 位 3.7.2 set-group-ID 位 3.7.3 sticky 位 3.7.4 用 ls -l 看到的特殊属性 3.8 ls 小结 3.9 设置和修改文件的属性 3.9.1 文件类型 3.9.2 许可位与特殊属性位 3.9.3 文件的链接数 3.9.4 文件所有者与组 3.9.5 文件大小 3.9.6 时间 3.9.7 文件名 小结 第四章 文件系统:编写 pwd 4.1 介绍 4.2 从用户的角度看文件系统 4.2.1 目录和文件 4.2.2 目录命令 4.2.3 文件操作命令 4.2.4 针对目录树的命令 4.2.5 目录树的深度几乎没有限制 4.2.6 Unix 文件系统小结 4.3 Unix 文件系统的内部结构 4.3.1 第一层抽象:从磁盘到分区 4.3.2 第二层抽象:从磁盘到块序列 4.3.3 第三层抽象:从块序列到三个区域的划分 4.3.4 文件系统的实现:创建一个文件的过程 4.3.5 文件系统的实现:目录的工作过程 4.3.6 文件系统的实现:cat 命令的工作原理 4.3.7 i- 节点和大文件 4.3.8 Unix 文件系统的改进 4.4 理解目录 4.4.1 理解目录结构 4.4.2 与目录树相关的命令和系统调用 4.5 编写 pwd 4.5.1 pwd 的工作过程 4.5.2 pwd 的一种版本 4.6 多个文件系统的组合:由多棵树构成的树 4.6.1 装载点 4.6.2 多重 i- 节点号和设备交叉链接 4.6.3 符号链接 小结 第五章 连接控制:学习 stty 5.1 为设备编程 5.2 设备就像文件 5.2.1 设备具有文件名 5.2.2 设备和系统调用 5.2.3 例子:终端就像文件 5.2.4 设备文件的属性 5.2.5 编写 write 程序 5.2.6 设备文件和 i- 节点 5.3 设备与文件的不同之处 5.4 磁盘连接的属性 5.4.1 属性 1:缓冲 5.4.2 属性 2:自动添加模式 5.4.3 用 open 控制文件描述符 5.4.4 磁盘连接小结 5.5 终端连接的属性 5.5.1 终端的 I/O 并不如此简单 5.5.2 终端驱动程序 5.5.3 stty 命令 5.5.4 编写终端驱动程序:关于设置 5.5.5 编写终端驱动程序:关于函数 5.5.6 编写终端驱动程序:关于位 5.5.7 编写终端驱动程序:几个程序例子 5.5.8 终端连接小结 5.6 其他设备编程:ioctl 5.7 文件、设备和流 小结 第六章 为用户编程:终端控制和信号 6.1 软件工具与针对特定设备编写的程序 6.2 终端驱动程序的模式 6.2.1 规范模式:缓冲和编辑 6.2.2 非规范处理 6.2.3 终端模式小结 6.3 编写一个用户程序:play_again.c 6.4 信号 6.4.1 Ctrl-C 能做什么 6.4.2 信号是什么 6.4.3 进程该如何处理信号 6.4.4 信号处理的例子 6.5 为处理信号做准备:play_again4.c 6.6 进程终止 6.7 为设备编程 小结 第七章 事件驱动编程:编写一个视频游戏 7.1 视频游戏和操作系统 7.2 任务:单人弹球游戏(Pong) 7.3 屏幕编程:curses 库 7.3.1 介绍 curses 7.3.2 curses 内部:虚拟和实际屏幕 7.4 时间编程:sleep 7.5 时钟编程 1:Alarms 7.5.1 添加时延:sleep 7.5.2 sleep() 是如何工作的:使用 Unix 中的 Alarms 7.5.3 调度将要发生的动作 7.6 时间编程 2:间隔计时器 7.6.1 添加精度更高的时延:usleep 7.6.2 三种计时器:真实、进程和实用 7.6.3 两种间隔:初始和重复 7.6.4 用间隔计时器编程 7.6.5 计算机有几个时钟 7.6.6 计时器小结 7.7 信号处理 1:使用 signal 7.7.1 早期的信号处理机制 7.7.2 处理多个信号 7.7.3 测试多个信号 7.7.4 信号机制其他的弱点 7.8 信号处理 2:sigaction 7.8.1 处理多个信号:sigaction 7.8.2 信号小结 7.9 防止数据损毁(Data Corruption) 7.9.1 数据损毁的例子 7.9.2 临界区(Critical Sections) 7.9.3 阻塞信号:sigprocmask 和 sigsetops 7.9.4 重入代码(Reectrant Code):递归调用的危险 7.9.5 视频游戏中的临界区 7.10 kill:从另一个进程发送的信号 7.11 使用计时器和信号:视频游戏 7.11.1 bounce1d.c:在一条线上控制动画 7.11.2 bounce2d.c:两维动画 7.11.3 完成游戏 7.12 输入信号:异步 I/O 7.12.1 使用异步 I/O 7.12.2 方法 1:使用 O_ASYNC 7.12.3 方法 2:使用 aio_read 7.12.4 弹球程序中需要异步读入吗 7.12.5 异步输入、视频游戏和操作系统 小结 第八章 进程和程序:编写命令解释器 sh 8.1 进程-运行中的程序 8.2 通过命令 ps 学习进程 8.2.1 系统进程 8.2.2 进程管理和文件管理 8.2.3 内存和程序 8.3 shell:进程控制和程序控制的一个工具 8.4 shell 是如何运行程序的 8.4.1 shell 的主循环 8.4.2 问题 1:一个程序如何运行另一个程序 8.4.3 问题 2:如何建立新的进程 8.4.4 问题 3:父进程如何等待子进程的退出 8.4.5 小结:shell 如何运行程序 8.5 实现一个 shell:psh2.c 8.6 思考:用进程编程 8.7 exit 和 exec 的其他细节 8.7.1 进程死亡:exit 和 _exit 8.7.2 exec 家族 小结 第九章 可编程的 shell、shell 变量和环境:编写自己的 shell 9.1 shell 编程 9.2 什么是以及为什么要使用 shell 脚本语言 9.3 smshl——命令行解析 9.4 shell 中的流程控制 9.4.1 if 语句做些什么 9.4.2 if 是如何工作的 9.4.3 在 smsh 中增加 if 9.4.4 smsh2.c:修改后的代码 9.5 shell 变量:局部和全局 9.5.1 使用 shell 变量 9.5.2 变量的存储 9.5.3 增加变量的命令:Built-ins 9.5.4 效果如何 9.6 环境:个性化设置 9.6.1 使用环境 9.6.2 什么是环境以及它是如何工作的 9.6.3 在 smsh 中增加环境处理 9.6.4 varlib.c 的代码 9.7 已实现的 shell 的功能 小结 第十章 I/O 重定向和管道 10.1 shell 编程 10.2 一个 shell 应用程序:监视系统用户 10.3 标准 I/O 与重定向的若干概念 10.3.1 概念 1:3 个标准文件描述符 10.3.2 默认的连接:tty 10.3.3 程序都输出到 stdout 10.3.4 重定向 I/O 的是 shell 而不是程序 10.3.5 理解 I/O 重定向 10.3.6 概念 2:“最低可用文件描述符(Lowest-Available-fd)”原则 10.3.7 两个概念的结合 10.4 如何将 stdin 定向到文件 10.4.1 方法 1:close then open 10.4.2 方法 2:open..close..dup..close 10.4.3 系统调用 dup 小结 10.4.4 方法 3:open..dup2..close 10.4.5 shell 为其他程序重定向 stdin 10.5 为其他程序重定向 I/O:who > userlist 10.6 管道编程 10.6.1 创建管道 10.6.2 使用 fork 来共享管道 10.6.3 使用 pipe、fork 以及 exec 10.6.4 技术细节:管道并非文件 小结 第十一章 连接到近端或远端的进程:服务器与 Socket(套接字) 11.1 产品和服务 11.2 一个简单的比喻:饮料机接口 11.3 bc:Unix 中使用的计算器 11.3.1 编写 bc:pipe、fork、dup、exec 11.3.2 对协同进程的讨论 11.3.3 fdopen:让文件描述符像文件一样使用 11.4 popen:让进程看似文件 11.4.1 popen 的功能 11.4.2 实现 popen:使用 fdopen 命令 11.4.3 访问数据:文件、应用程序接口(API)和服务器 11.5 socket:与远端进程相连 11.5.1 类比:“电话中传来声音:现在时间是……” 11.5.2 因特网时间、DAP 和天气服务器 11.5.3 服务列表:众所周知的端口 11.5.4 编写 timeserv.c:时间服务器 11.5.5 测试 timeserv.c 11.5.6 编写 timeserv.c:时间服务器客户端 11.5.7 测试 timeclnt.c 11.5.8 另一种服务器:远程的 ls 11.6 软件精灵 小结 第十二章 连接和协议:编写 Web 服务器 12.1 服务器设计重点 12.2 三个主要操作 12.3 操作 1 和操作 2:建立连接 12.3.1 操作 1:建立服务器端 socket 12.3.2 操作 2:建立到服务器的连接 12.3.3 socklib.c 12.4 操作 3:客户/服务器的会话 12.4.1 使用 socklib.c 的 timeserv/timeclnt 12.4.2 第 2 版的服务器:使用 fock 12.4.3 服务器的设计问题:DIY 或代理 12.5 编写 Web 服务器 12.5.1 Web 服务器功能 12.5.2 设计 Web 服务器 12.5.3 Web 服务器协议 12.5.4 编写 Web 服务器 12.5.5 运行 Web 服务器 12.5.6 Webserv 的源程序 12.5.7 比较 Web 服务器 小结 第十三章 基于数据报(Datagram)的编程:编写许可证服务器 13.1 软件控制 13.2 许可证控制简史 13.3 一个非计算机系统实例:轿车管理系统 13.3.1 轿车钥匙管理描述 13.3.2 用客户/服务器方式管理轿车 13.4 许可证管理 13.4.1 许可证服务系统:它做些什么 13.4.2 许可证服务系统:如何工作 13.4.3 一个通信系统的例子 13.5 数据报 socket 13.5.1 流与数据报的比较 13.5.2 数据报编程 13.5.3 sendto 和 recvfrom 的小结 13.5.4 数据报应答 13.5.5 数据报小结 13.6 许可证服务器版本 1.0 13.6.1 客户端版本 1 13.6.2 服务器端版本 1 13.6.3 测试版本 1 13.6.4 进一步的工作 13.7 处理现实的问题 13.7.1 处理客户端崩溃 13.7.2 处理服务器崩溃 13.7.3 测试版本 2 13.8 分布式许可证服务器 13.9 Unix 域 socket 13.9.1 文件名作为 socket 地址 13.9.2 使用 Unix 域 socket 编程 13.10 小结:socket 和服务器 小结 第十四章 线程机制:并发函数的使用 14.1 同一时刻完成多项任务 14.2 函数的执行路线 14.2.1 一个单线程程序 14.2.2 一个多线程程序 14.2.3 相关函数小结 14.3 线程间的分工合作 14.3.1 例 1:incrprint.c 14.3.2 例 2:twordcount.c 14.3.3 线程内部的分工合作:小结 14.4 线程与进程 14.5 线程间互通消息 14.5.1 通知选举中心 14.5.2 使用条件变量编写程序 14.5.3 使用条件变量的函数 14.5.4 回到 Web 服务器的例子 14.6 多线程的 Web 服务器 14.6.1 Web 服务器程序的改进 14.6.2 多线程版本允许一个新的功能 14.6.3 防止僵尸线程(Zombic Threads):独立线程 14.6.4 Web 服务器代码 14.7 线程和动画 14.7.1 使用线程的优点 14.7.2 多线程版本的 bounceld.c 14.7.3 基于多线程机制的多重动画:tanimate.c 14.7.4 tanimate.c 中的互斥量 14.7.5 屏幕控制线程 小结 第十五章 进程间通信(IPC) 15.1 编程方式的选择 15.2 talk 命令:从多个数据源读取数据 15.2.1 同时从两个文件描述符读取数据 15.2.2 select 系统调用 15.2.3 select 与 talk 15.2.4 select 与 poll 15.3 通信的选择 15.3.1 一个问题的三种解决方案 15.3.2 通过文件的进程间通信 15.3.3 命名管道 15.3.4 共享内存 15.3.5 各种进程间通信方法的比较 15.4 进程之间的分工合作 15.4.1 文件锁 15.4.2 信号量(Semaphores) 15.4.3 socket 及 FIFO 与共享的存储 15.5 打印池 15.5.1 多个写者、一个读者 15.5.2 客户/服务器模型 15.6 纵观 IPC 15.7 连接与游戏 小结
本书详细介绍了利用Visual C# 2005进行网络编程的方法和技巧。全书共分13章,主要内容包括网络编程原理、Visual C# 2005的套接字以及多线程的开发、基于各种不同协议的网络编程应用模块,并通过几个典型的实例介绍了Visual C# 2005网络编程的实际应用。 本书注重代码的通用性和工程实践性,书中提供的通用模块和典型实例稍加修改就可以为读者所用。   本书不仅适用于使用Visual C# 2005进行软件开发的广大软件开发人员,也适合高等院校师生学习和参考使用,特别对高校计算机专业的学生进行毕业设计具有非常好的指导价值,也可以作为广大计算机编程爱好者的自学参考书。 第1章 C#.NET网络编程概述  1.1 网络通信概述   1.1.1 网络通信模型概述   1.1.2 网络通信协议、接口和服务概述   1.1.3 TCP/IP网络架构概述   1.1.4 IP地址与端口  1.2 C#.NET网络编程相关类   1.2.1 IPAddress类   1.2.2 DNS类   1.2.3 IPHostEntry类   1.2.4 IPEndPoint类   1.2.5 Socket类  1.3 套接字概述   1.3.1 套接字的类型和常用属性   1.3.2 建立面向连接的套接字   1.3.3 建立面向无连接的套接字  1.4 使用套接字的简单示例   1.4.1 C/S与B/S架构通信模式概述   1.4.2 编写客户端代码   1.4.3 编写服务器端代码 .  1.4.4 无阻塞套接字  1.5 本章小结 第2章 C#.NET高级网络编程技术概述  2.1 线程与网络通信   2.1.1 基于线程的网络通信概述   2.1.2 在网络编程中使用多线程   2.1.3 线程基础   2.1.4 多线程在网络编程中的应用  2.2 网络通信的常见问题   2.2.1 让网络通信代码更强壮   2.2.2 数据缓冲区处理方法  2.3 TCP无保护消息边界   2.3.1 发送固定长度的消息   2.3.2 采用变长的消息   2.3.3 使用特殊标记处理消息  2.4 本章小结 第3章 开发基于TCP协议的应用程序  3.1 套接字与TCP协议   3.1.1 使用套接字传输数据   3.1.2 NetworkStream对象同数据发送与接收   3.1.3 TcpClient与TcpListener类   3.1.4 使用TCP/IP协议编写应用层的通信代码  3.2 开发异步的TCP应用编程   3.2.1 TCP的异步通信流程   3.2.2 线程阻塞与异步中的同步问题  3.3 开发异步的TCP聊天程序   3.3.1 客户端界面设计   3.3.2 客户端业务逻辑设计   3.3.3 服务器端界面设计   3.3.4 服务器端业务逻辑设计   3.3.5 运行界面  3.4 本章小结 第4章 开发基于UDP的应用程序  4.1 UDP通信协议概述   4.1.1 UDP协议与TCP协议的差别   4.1.2 UDP协议的使用场合  4.2 在C#下UDP协议的相关类   4.2.1 IPAddress类   4.2.2 UdpClient类的构造函数   4.2.3 UdpClient类的常用方法与实例  4.3 UDP协议使用示例   4.3.1 UDP模块功能概述   4.3.2 设计通信流程   4.3.3 开发服务器端程序   4.3.4 开发客户端程序   4.3.5 使用多线程开发UDP协议   4.3.6 使用校验保证信息完整性   4.3.7 效果演示  4.4 本章小结 第5章 开发基于SNMP协议的应用程序  5.1 SNMP协议概述   5.1.1 了解SNMP协议   5.1.2 SNMP的常用命令   5.1.3 设计SNMP包  5.2 SNMP协议使用示例   5.2.1 需求分析与设计   5.2.2 设计程序流程   5.2.3 程序窗口界面设计   5.2.4 SNMP类编写   5.2.5 SNMP程序窗口类编写  5.3 运行效果演示  5.4 使用供货商提供的MIB库  5.5 本章小结 第6章 使用.NET发送邮件  6.1 邮件发送与接收协议概述   6.1.1 SMTP协议与邮件发送   6.1.2 POP3协议与邮件接收   6.1.3 .NET下支持SMTP和POP3的类  6.2 邮件发送与接收模块   6.2.1 需求分析与设计   6.2.2 设计邮件发送和接收的流程   6.2.3 界面设计   6.2.4 编写主窗口的业务逻辑   6.2.5 编写发送邮件的业务逻辑   6.2.6 编写接收邮件的业务逻辑   6.2.7 使用多线程发送与接收邮件  6.3 运行效果演示  6.4 本章小结 第7章 FTP下载与文件传输  7.1 FTP协议概述   7.1.1 使用FTP协议下载文件的流程   7.1.2 相关类库说明  7.2 FTP客户端设计   7.2.1 需求分析   7.2.2 界面设计   7.2.3 业务逻辑设计  7.3 FTP服务器端设计   7.3.1 需求分析   7.3.2 FTP响应码   7.3.3 业务逻辑设计  7.4 运行界面  7.5 本章小结 第8章 基于C#.NET的网络管理模块  8.1 ICMP协议概述   8.1.1 ping命令   8.1.2 tracert命令  8.2 ICMP包  8.3 编写网络管理模块   8.3.1 需求分析   8.3.2 界面设计   8.3.3 编写核心icmp类的业务逻辑   8.3.4 编写具有ping功能的业务逻辑   8.3.5 编写具有tracert功能的业务逻辑   8.3.6 编写findmask功能的业务逻辑   8.3.7 编写时间戳功能的业务逻辑  8.4 运行界面  8.5 本章小结 第9章 编写基于.NET的Web Service  9.1 Web Service概述   9.1.1 Web服务基本概念   9.1.2 Web服务的优势   9.1.3 Web服务的架构  9.2 需求分析与设计   9.2.1 需求分析   9.2.2 文件功能设计   9.2.3 数据库设计  9.3 编写Web Service服务系统   9.3.1 构建Web Service   9.3.2 编写Web服务代码   9.3.3 主页面与登录相关的WebService数据访问模块   9.3.4 发表主题相关的Web Service访问模块   9.3.5 投票相关的Web Service访问模块   9.3.6 管理相关的Web Service访问模块  9.4 主页面与登录模块   9.4.1 界面设计   9.4.2 编写业务逻辑  9.5 发表主题模块   9.5.1 界面设计   9.5.2 编写业务逻辑  9.6 投票模块   9.6.1 界面设计   9.6.2 编写业务逻辑  9.7 管理模块   9.7.1 界面设计   9.7.2 编写业务逻辑  9.8 本章小结 第10章 基于.NET的远程技术  10.1 远程技术概述   10.1.1 远程技术开发结构   10.1.2 远程技术使用  10.2 远程控制开发客户端的设计   10.2.1 界面设计与控件使用   10.2.2 客户端的代码设计  10.3 远程控制开发服务器端的设计   10.3.1 界面设计与控件使用   10.3.2 服务器端的代码设计  10.4 运行效果演示  10.5 本章小结 第11章 流媒体在线播放  11.1 需求分析与设计   11.1.1 需求分析   11.1.2 模块设计   11.1.3 数据库设计  11.2 DirectShow接口   11.2.1 滤波图模型   11.2.2 如何使用DirectShow接口   11.2.3 流媒体在线播放相关接口  11.3 流媒体协议   11.3.1 实时传输协议(RTP)   11.3.2 实时传输控制协议(RTCP)   11.3.3 实时流传输协议(RTSP)   11.3.4 流媒体服务过程  11.4 建立.NET的窗体项目   11.4.1 主窗口界面设计   11.4.2 收藏夹数据库相关业务逻辑设计   11.4.3 流媒体在线播放器业务逻辑设计  11.5 运行效果演示  11.6 本章小结 第12章 在线五子棋系统模块  12.1 需求分析与设计   12.1.1 需求分析   12.1.2 模块设计  12.2 五子棋规则类设计   12.2.1 胜负判定类   12.2.2 行棋规则类  12.3 基于TCP协议的通信类   12.4 网络配置模块   12.4.1 网络配置模块的界面设计   12.4.2 网络配置模块的代码设计  12.5 扫描主机模块   12.5.1 扫描主机模块的界面设计   12.5.2 扫描主机模块的代码设计  12.6 主界面模块   12.6.1 主界面模块的界面设计   12.6.2 主界面模块的代码设计  12.7 运行界面  12.8 本章小结 第13章 基于HTTP协议的下载工具  13.1 HTTP协议   13.1.1 HTTP下载理论   13.1.2 .NET的几个支持HTTP协议的类  13.2 异步机制   13.2.1 异步机制的原理   13.2.2 异步类  13.3 下载工具的设计   13.3.1 需求设计   13.3.2 模块设计   13.3.3 界面设计   13.3.4 业务逻辑设计  13.4 运行效果演示  13.5 本章小结 Microsoft Visual C# 2005是一种新的编程环境,它是为生成在.NET Framework上运行的多种应用程序而设计的。C#简单,功能强大,类型安全,而且是面向对象的。C#凭借它的许多创新实现了对应用程序的快速开发。. Visual Studio支持Visual C#,这是通过功能齐全的代码编辑器、项目模板、设计器、代码向导、功能强大且易于使用的调试器以及其他工具实现的。通过.NET Framework类库,可以访问多种操作系统服务和其他有用的精心设计的类,这些类可显著加快开发周期。 本书大量地使用了.NET Framework提供的类库中的函数来协同开发,通过使用这些已经被封装的类来协助开发确实提高了不少效率,为开发工作带来了诸多的便利。 本书共分13章,第1章介绍了利用Visual C# 2005提供的网络命名空间下的诸多API进行套接字的开发,并对网络编程的原理进行了详细的阐述,为后续的章节奠定了基础。 第2章介绍了具有多线程能力的网络应用程序,这使得用户开发的程序能够适应更加复杂的情况。 第3章~第8章是本书的重要部分,主要介绍基于各种不同协议的网络编程应用模块。第3章介绍了基于TCP协议的聊天程序;第4章介绍了基于UDP的通信程序;第5章介绍了使用SNMP协议的网络管理程序;第6章介绍了使用SMTP以及POP3协议的E-mail系统;第7章介绍了基于FTP的文件传输模块;第8章介绍了使用ICMP协议的网络探测程序。 第9章介绍了基于Web Service的电子公告板系统,并结合采用了SQL Server 2005数据库;第10章介绍了使用远程控制技术的应用程序;第11章则介绍了流媒体在线播放系统。.. 第12章介绍了基于TCP通信协议的在线五子棋系统;第13章主要介绍了基于HTTP协议的下载工具,该工具具有多线程下载、断点续传的功能。 本书注重理论指导性和工程实践性,书中提供的各个网络应用程序只要稍加修改就可以为读者所用。本书不仅适用于使用Visual C# 2005进行软件开发的广大软件开发人员,也适合高等院校师生学习和参考使用,特别对高校计算机专业的学生进行毕业设计具有非常好的指导价值,也可以作为广大计算机编程爱好者的自学、参考用书。 本书主要由梅晓冬、颜烨青执笔,在编写本书程序的过程中,得到了陈璧元的大力支持,在此表示衷心的感谢。此外,还要感谢杨文军、程伟、袁远、刘武、彭澜、李通、李杰、卢茂琼、张燕生、胡燕生、邓湘成、卢下知、王周浩、邱岳、刘流、代本、刘明星、孙靖华等人,他们在本书编写过程中给予了我鼓励和支持。 由于时间仓促,加之水平有限,书中不足之处在所难免,敬请读者批评指正。... 编者 2008年1月
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页