MFC类库为我们提供了“方便、好用”的CAsyncSocket和CSocket,但是MFC本身就是一个迷宫,进去一不小心就出不来了。像CAsyncSocket和CSocket它们是实现是很复杂的,里面实现异步消息是通过窗体的消息机制来实现的,常常出现初始化时的错误,即使运行一段时间程序也常常出现莫名其妙的错误导致程序崩溃。你不要以为是MFC的问题,MFC是绝对不会承认的,有时候你不得不采用逐行注释代码的方法来确定什么地方导致程序的错误,这个过程是相当痛苦的,最后你还得为错误买单,肯定是你编程的错误,但你又不知道错在哪儿。
我有一次编写录音功能的网络程序,接收到远程录音传输的数据保存在内存中,后来发现程序不定时的在启动的时候调用CSocket.Create出错。程序都了N遍也不知道为什么,关键是不定时的,调试也麻烦,最后只好采用注释的方式。最终发现接收到录音数据保存到内容那段代码注释掉就好了,我认真看了那段代码,绝对没有内存溢出会导致覆盖掉CSocket,每次接收数据总和也不会超过1M,不可能把内容耗尽。其实很多很成熟的软件都有类似的错误,老版本的迅雷也曾经出现过这种错误,错误的提示我忘了。
用了一年的CAsyncSocket后,我下了决心以后决不用它了,当然也不会用从它继承而来的CSocket。那就用C++的SOCKET,什么操作和错误都是掌握在自己的手中。没有了CAsyncSocket的异步消息机制自己用线程来做,网络编程多线程是第一课。
经过长期的实贱,封装了如下SOCKET函数,其实使用也挺简单的:
1。客户端函数:
#include<stdlib.h>
#include<winsock.h>
#include<stdio.h>
#include<string.h>
#ifndef INADDR_NONE
#define INADDR_NONE 0xffffffff
#endif
//******************************************************
//
//本函数负责与服务平台联系
//
//******************************************************
SOCKET SocketConnect(const char *host,const char *service,const char *transport)
{
struct protoent *protoin;//传输协议信息
struct sockaddr_in ipaddr;//主机的IP地址信息
struct hostent *hostin;//主机的信息
struct servent *servin;//服务器(主机)信息
int sock,type;//套接字描述符
//将ipaddr结构快速清零
memset(&ipaddr,0,sizeof(ipaddr));
//地址结构
ipaddr.sin_family=AF_INET;
//从服务器类型得到端口号
if(servin=getservbyname(service,transport))
ipaddr.sin_port=servin->s_port;//端口号
