标准MFC WinSock ActiveX控件开发实例
2009-05-04 20:06:26 来源:WEB开发网编写我们刚才的接口Connect(),代码代码如下: 在MFCWinSockCtrl.h中加入
SOCKET OnlySock;//建立的唯一Socket,不允许重复建立多个
然后再编写Connect(),看起来如下:
bool isOnlyConnect;//是否建立了连接
BOOL CMFCWinSockCtrl::Connect(const VARIANT FAR& RemoteHost, const VARIANT FAR& RemotePort)
有必要提一下WSAAsyncSelect(),这里接收网络数据到达和断开的两个消息,我们收到WM_MYWINSOCK消息时将处理该消息并作为事件传送给调用者.
{
// TODO: Add your dispatch handler code here
if(isOnlyConnect)//该连接已建立,还没有断开
return FALSE;
CString IPAddress;
int Port;//转换成整型的端口
switch(RemoteHost.vt)
{
case VT_BSTR://字符串型
IPAddress = CString(RemoteHost.bstrVal);
break;
case VT_BYREF|VT_I1://CHAR *
IPAddress.Format("%s",RemoteHost.pcVal);//RemoteHost.pbstrVal);
break;
default:
IPAddress = "";
return FALSE;
}
Port = VariantToLong(RemotePort);//我们编写的一个VARIANT转换成long类型的函数
if(Port<=0)
return FALSE;
_TCHAR *ip = 0;
struct hostent *host = 0;
struct sockaddr_in addr;
ULONG dotIP = inet_addr(IPAddress);
OnlySock = socket(AF_INET, SOCK_STREAM, 0);
// 判断是否为点IP地址格式
if (OnlySock == INVALID_SOCKET)
{
shutdown(OnlySock, 0x02);
closesocket(OnlySock);//释放占有的SOCK资源
return FALSE;
}
memset(&addr, 0, sizeof(struct sockaddr_in));
// 设定 SOCKADDR_IN 结构的内容
// 如果通讯协议是选择IP Protocol,那此值固定为AF_INET
// AF_INET 与 PF_INET 这两个常量值相同
addr.sin_family = AF_INET;
addr.sin_port = htons(Port);
addr.sin_addr.S_un.S_addr = dotIP;
if (dotIP == INADDR_NONE)
{
host = gethostbyname(IPAddress);
if (!host)
{
shutdown(OnlySock, 0x02);
closesocket(OnlySock);//释放占有的SOCK资源
return FALSE;
};
ip = inet_ntoa(*(struct in_addr*)(*host->h_addr_list));
addr.sin_addr.S_un.S_addr = inet_addr(ip);
}
//开始连线
if (connect(OnlySock, (LPSOCKADDR)&addr, sizeof(SOCKADDR)))
{
shutdown(OnlySock, 0x02);
closesocket(OnlySock);//释放占有的SOCK资源
return FALSE;
}
int iError = WSAAsyncSelect(OnlySock, m_hWnd,WM_MYWINSOCK, FD_READ|FD_CLOSE); //只对网络断开和数据到达通知感兴趣
if(iError == SOCKET_ERROR)//无法绑定Winsock的事件通知
{
shutdown(OnlySock, 0x02);
closesocket(OnlySock);//释放占有的SOCK资源
return FALSE;
}
isOnlyConnect = true;
return TRUE;
}
赞助商链接