TO oldfoxXP(oldfox): 我同意你的看法!!! 对于高速CPU、大容量内存和硬盘来说效率问题应该放到次席,系统的稳定性是应该首先考虑的!!! 我有一个搞数据库开发的同学,他说自己创建表的时候基本上只符合第二范式,原因就是对于高性能的服务器来说可以忽略效率问题,而且很多公司也都认同了这种想法!!!
异步读写吧我想就是这样。 这本书有原理 Programming Server-Side Applications for Microsoft Windows 2000 在这个地方有得下: http://www.bjdt2.com/bbs/book/e5/other/microsoft/programming.htm
但你编一个程序,不可能只有网络连接,没其他东西吧。
那你的意思是MFC用来做界面,
然后用API写网络方面的东西是吗?
是不是桌面应用程序大部分是用MFC写?
建议你,把机械工业出版社出的《Windows网络编程技术》看N遍后,再利用MFC或者SDK编写一些小的通信例程,然后编写较大规模的网络程序,最后你就明白了网络编程了!!!
多学点驱动程序编程吧。
机械工业出版社出的《Windows网络编程技术》里面的代码怎么都是C语言写的?
是不是Windows网络编程就是用C语言写?
还有,现在我在学Windows API编程,发现代码也全是C,只不过一些数据类型
换了一下而矣。有人说MFC只是对API进行了封装而矣,是不是MFC用C++对API
进行了封装?MFC编程是用C++写代码。
我说学mfc的目的是给别人一个可操作的界面。
你见过那个API使用CString对象做参数吗?(:
在VC中,调用Windows的任何API都是再正常不过的事情。
1.机械工业出版社出的《Windows网络编程技术》里面的代码怎么都是C语言写的?
因为若想对Windows进行网络编程,则必须有网络编程接口函数(即网络API),这些接口函数是供程序员使用的。Windows操作系统据说就是用C语言写的,所以那些接口函数也是用C语言写的。机械工业出版社出的《Windows网络编程技术》里面的代码要使用这些接口函数,所以使用了最让人接收的方式(即使用C语言)编写代码?2.是不是Windows网络编程就是用C语言写?
也不一定,因为MFC对一些网络编程接口进行了封装,所以你也可以使用面向对象的方法编写程序。3.有人说MFC只是对API进行了封装而矣,是不是MFC用C++对API进行了封装?
是的,MFC用面向对象的方法把大部分的API函数封装到类中。我可以给你举一个套接字类CAsyncSocket的例子。
该类有一个成员函数是Create,如下所示:
BOOL CAsyncSocket::Create(UINT nSocketPort,int nSocketType,long lEvent,LPCTSTR lpszSocketAddress)
{
if (Socket(nSocketType,lEvent))
{
if (Bind(nSocketPort,lpszSocketAddress))
return TRUE;
int nResult = GetLastError();
Close();
WSASetLastError(nResult); //对WSAGetLastError()封装
}
return FALSE;
}BOOL CAsyncSocket::Socket(int nSocketType,long lEvent,int nProtocolType,int nAddressFormat)
{
ASSERT(m_hSocket == INVALID_SOCKET);
m_hSocket = socket(nAddressFormat,nSocketType,nProtocolType);//对socket()封装
......
}BOOL CAsyncSocket::Bind(UINT nSocketPort,LPCTSTR lpszSocketAddress)
{
USES_CONVERSION;
//构造地址信息
SOCKADDR_IN sockAddr;
memset(&sockAddr,0,sizeof(sockAddr));
//得到地址参数的值
LPSTR lpszAscii = T2A((LPTSTR)lpszSocketAddress);
//指定是Internet类型的地址
socketAddr.sin_family = AF_INET;
//如果没有指定地址,则自动的得到一个本地IP地址
//同时进行字节顺序的转换:从本地字节顺序到网络字节顺序。
if (lpszAscii == NULL)
{
socketAddr.sin_addr.s_addr = htonl(INADDR_ANY);
}
else
{
DWORD lResult = inet_addr(lpszAscii);
if (lResult == INADDR_NONE)
{
WSASetLastError(WSAEINVAL);
return FALSE;
}
sockAddr.sin_addr.s_addr = lResult;
//如果指定的端口号是0,则分配一个端口号(1024到5000)
//同时进行字节顺序的转换:从本地字节顺序到网络字节顺序。
sockAddr.sin_port = htons((u_short)nSocketPort);
//调用Window Sockets API函数bind()
return bind((SOCKADDR*)&sockAddr,sizeof(sockAddr));
}
}
我同意你的看法!!!
对于高速CPU、大容量内存和硬盘来说效率问题应该放到次席,系统的稳定性是应该首先考虑的!!!
我有一个搞数据库开发的同学,他说自己创建表的时候基本上只符合第二范式,原因就是对于高性能的服务器来说可以忽略效率问题,而且很多公司也都认同了这种想法!!!
不过我觉得,mfc和API结合会有更好的效果,可以相互弥补彼此的不足
//===================================================
CSocket是为了窗口编程用的,用在其他方面是不太好。确实大部分的网络程序可能都不是用的CSocket.
假如写窗口类,当然是用MFC了。其他的就不用了吧。
我补充一点,虽然CAsyncSocket类和CSocket的类都是针对窗口编程的,但是它们不能充分利用五种套接字I/O模型,尤其是WSAEventSelect模型、重叠模型和完全端口模型,对于套接字什么时候该读、什么时候该写是不能完全依靠窗口响应消息函数的!!!
有时候要在多现程中编写网络程序,为了线程之间的同步操作,那么我们最好使用WSAEventSelect模型!!!
如果想以较高的效率管理较多(100以内)的套接字,那么最好使用重叠模型。
如果想管理大量(成百上千)的套接字,那么最好使用完全端口模型。
当然,这只是一个普遍性原则。
完成端口FRAMEWORK,有兴趣的话帮我测试一下,这是初稿(实现了线程池调度)。
有BUG或者建议发EMAIL我或者发短信给我。
这本书有原理
Programming Server-Side Applications for Microsoft Windows 2000
在这个地方有得下:
http://www.bjdt2.com/bbs/book/e5/other/microsoft/programming.htm
2:MFC通过C++把用C写的API封装了一遍
3:是api,但是你可以自己用c++来封装
4:底层如网络部分多用api,快速开发就可以用MFC