WEB开发网
开发学院软件开发VC 标准MFC WinSock ActiveX控件开发实例 阅读

标准MFC WinSock ActiveX控件开发实例

 2009-05-04 20:06:26 来源:WEB开发网   
核心提示: 编写我们刚才的接口Connect(),代码代码如下: 在MFCWinSockCtrl.h中加入 SOCKETOnlySock;//建立的唯一Socket,不允许重复建立多个boolisOnlyConnect;//是否建立了连接 然后再编写Connect(),标准MFC WinS

编写我们刚才的接口Connect(),代码代码如下: 在MFCWinSockCtrl.h中加入 SOCKET OnlySock;//建立的唯一Socket,不允许重复建立多个
bool isOnlyConnect;//是否建立了连接
   
然后再编写Connect(),看起来如下: BOOL CMFCWinSockCtrl::Connect(const VARIANT FAR& RemoteHost, const VARIANT FAR& RemotePort) 
{

// 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;
}
   
有必要提一下WSAAsyncSelect(),这里接收网络数据到达和断开的两个消息,我们收到WM_MYWINSOCK消息时将处理该消息并作为事件传送给调用者.

上一页  1 2 3 4 5  下一页

Tags:标准 MFC WinSock

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接