最近研究了一下C++里面的C++封装Socket的问题,但是始终都是困难重重,以至于开始看Socket不顺眼了,幸亏一个编程专家给了我一段socket raw编程的代码,有一段看的的我很是晕。代码如下:
- if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0){
- printf("WSAStartup failed: %d\n",ErrorCode);
- return 2;
- }
- sockMain=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED);
- if(sockMain==INVALID_SOCKET)
- {
- printf("Socket failed: %d\n",WSAGetLastError());
- return 3;
- }
- ErrorCode=setsockopt(sockMain,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));
- if(ErrorCode==SOCKET_ERROR)
- {
- printf("Set sockopt failed: %d\n",WSAGetLastError());
- return 4;
- }
- ErrorCode=setsockopt(sockMain,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
- if(ErrorCode==SOCKET_ERROR)
- {
- printf("Set sockopt time out failed: %d\n",WSAGetLastError());
- return 5;
- }
也许很多人都觉得我神经,这个不是每个socket程序的必经之路么?要是觉得这个很难受破坏结构,那还怎么写大型的socket程序?也许吧,我说了我就是一个死脑筋,总喜欢看起来好一些东西。总觉得那种每一个函数调用后,就跟着一堆针对返回值得错误处理语句很罗嗦,为什么不用异常来使这些更优雅呢?代码上的优雅同时也就意味着代码的出错几率的降低。
再加上我对于孟岩他们所探讨的C++异常机制的怀疑还是无法深入理解。所以我打算尝试一下充分使用异常机制来完成类似上述代码得错误处理,用C++封装Winsock函数库,以后基于这个自己写的Socket C++类库,写一些通讯程序,从而暴露一些异常机制的弊病,让自己充分的理解异常机制的一些害处。现在我的理解还是太肤浅了,不够深入。
我现在的感觉是网络通讯中出现的异常简直太正常了,因为你无法预计将会发生什么,哪里会出错误,因此用异常机制去处理时非常合适的。而且我注意到很多地方的错误返回,又不少是错误发生后,确实没什么办法可以恢复的。所以,应该也不违背一些规则。试试看吧。
其实我本来是想找一个STL类似的类库,结果没找到。找到一个ACE结果把我给吓回去了,好大啊。没必要把。我只需要一个简单的用C++特性进行封装的Socket类库而已。如果有人听说了的话,请告诉我,省得我在这里白费力气。哦,不过也不白费力气,自己实现一些东西,挺好的。
我自己没读过STL代码,因此无法写出STL或者Boost风格的代码来,只能按照自我的想象,反复的调整代码了。不过通过封装一个类库,不断地debug,不断地完善,我对C++的理解一定会进一步的。也许那个时候我会说“哦?这是谁写的垃圾代码啊,简直不堪入目,愚蠢至极。wait,好像是我写的”然后就是羞愧至极。呵呵。
目前我实现了一个最简单的socket类库,准确说还不能叫做实现了一个类库,只能叫做用C++封装了几个socket函数而已,暂时只能叫做概念试验,但是我希望将来有一天这个能成长为一个比较简单、实用的C++ Socket类库。目前其中有3个类。
【编辑推荐】