功能:我要在一个DLL中取数据,其中数据是SOCKET发过来的,也就是说我要把SOCKET做在DLL中:代码:
bool __stdcall Init(char* ini)
{
link=false;
if(WSAStartup(MAKEWORD(2,1),&wsaData)) //加载套接字库
{
WSACleanup();
}
else
{
sockClient=socket(AF_INET,SOCK_STREAM,0);//IPPROTO_TCP);
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.2");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(8500);
if(connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(addrSrv))!=SOCKET_ERROR)
{
link=true;
WSAAsyncSelect(sockClient,theApp.m_pMainWnd->m_hWnd,1000,FD_READ);
}
}
return link;
}BOOL CXXXXApp::PreTranslateMessage(MSG* pMsg) 
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message==1000)
{
ReceiveMess();//接收
}
return CWinApp::PreTranslateMessage(pMsg);
}
连的服务端程序是C#写的现在连不上,搞不懂哪里有问题,
我写的另一个程序不是DLL的,有连的上有时也连不上,当前我在一个文章说看到说是阻塞式的需要时间,不确定是不是这个因素,
哪个朋友帮看看上面DLL中的程序有什么要改正的地方

解决方案 »

  1.   

    link 返回成功了吗?
    如果是在dll 里,最好在 dllmain()
    {
      switch (reason)
      {
       case DLL_PROCESS_ATTACH:
            WSAStartup(MAKEWORD(2,1),&wsaData);
    break;
       case DLL_PROCESS_DETACH:
        wsacleanup();
    break;      
    }
    sockClient=socket(AF_INET,SOCK_STREAM,xxxx);如果是tcp协议就写IPPROTO_TCP,udp协议就写IPPROTO_udp,是啥写啥
    你使用的是异步 select 模式,向窗口发消息
    阻塞是指,发送/接收数据一定是发送/接收完毕,才会返回你的调用代码
    异步是指,发送/接收,调用相应的函数之后,立刻返回你的代码,无论发送/接收是否成功
      

  2.   

    回二楼,link返回的是false,那里连不上
      

  3.   

    WSAAsyncSelect
    需要消息循环, DLL默认是没有, 需要你自己创建一个, 要不创建的一个对话框句柄
      

  4.   

    WSAAsyncSelect(sockClient,theApp.m_pMainWnd->m_hWnd,1000,FD_READ);
    肯定返回有错误,
    theApp.m_pMainWnd->m_hWnd这个句柄有问题吧,
      

  5.   

    我这个DLL是有窗体的theApp.m_pMainWnd->m_hWnd我用这个指向窗体
      

  6.   

    6楼,你说对了,提示的是句柄错误unhandled exception那么我怎么改呢
      

  7.   

    如果  link == false 那么 WSAStartup(MAKEWORD(2,1),&wsaData)可能出错,或者
    connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(addrSrv))!=SOCKET_ERROR 出错
    你在这两句后面 wsagetlasterror 看看是什么错误
      

  8.   

    你dll的窗口怎么创建的?那个窗口的句柄应该可以获取吧?
      

  9.   

    如果是这行代码产生异常,则说明theApp.m_pMainWnd是空指针,检查一下你的程序在创建窗口后有没有给theApp.m_pMainWnd赋值,另外再确认一下创建窗口的代码是否已执行并且创建成功。