龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC++动态链接库编程之读者反馈与答复(3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
/* 获得目标节点端口与地址 */ struct sockaddr_in desAddr; desAddr.sin_family=AF_INET; desAddr.sin_port=htons( DES_RECV_PORT ); //目标节点接收端口 desAddr.sin_addr.s_addr = inet_addr(

 /* 获得目标节点端口与地址 */
 struct sockaddr_in desAddr;
 desAddr.sin_family=AF_INET;
 desAddr.sin_port=htons( DES_RECV_PORT ); //目标节点接收端口
 desAddr.sin_addr.s_addr = inet_addr( DES_IP );

 /* 发送数据 */
 while(1)
 {
  WaitForSingleObject( hSendEvent, 0xffffffffL );//无限等待事件发生
  ResetEvent( hSendEvent );

  sendto( sendSock, (char *)sendSockData.data, sendSockData.len, 0, (struct sockaddr*)&desAddr, sizeof(desAddr) );
 }
 return -1;
}
 (2)MFC规则DLL的InitInstance函数

/////////////////////////////////////////////////////////////////////////////
// CMultiThreadDllApp initialization
BOOL CMultiThreadDllApp::InitInstance()
{
 if ( !AfxSocketInit() ) //初始化socket
 {
  AfxMessageBox( IDP_SOCKETS_INIT_FAILED );
  return FALSE;
 }
 return TRUE;
}

  (3)启动发送线程

////////////////////////////////////////////////////////////////////////////////
//函数名:SendInit
//函数功能:DLL提供给应用程序调用接口,用于启动发送线程
/////////////////////////////////////////////////////////////////////////////
void SendInit(void)
{
 hSendThread = CreateThread( NULL, 1000, SendThreadFunc, this, 1, &uSendThreadID );
}
 

  (4)SendMsg函数

////////////////////////////////////////////////////////////////////////////////
//函数名:SendMsg
//函数功能:DLL提供给应用程序调用接口,用于发送报文
/////////////////////////////////////////////////////////////////////////////
extern "C" void WINAPI SendMsg( InterDataPkt sendData )
{
 sendSockData = sendData;
 SetEvent( hSendEvent ); //释放发送事件
}

  以上程序仅仅是一个简单的例子,其实在许多工程应用中,我们经常看到这样的处理方式。这个DLL对用户而言仅仅使一个简单的接口函数SendMsg,对调用它的应用程序屏蔽了多线程的技术细节。与之类似,MFC提供的CSocket类在底层自己采用了多线程机制,所以使我们免去了对多线程的使用。

精彩图集

赞助商链接