dll里面封装socket的思路

flyskytoday 2009-04-28 12:21:21
这几天做一个封装DLL文件,把SOCKET封装在里面,要求比较简单,做了三天,还没搞出来
要求:
1:初始化socket //opensocket(CString IPAddress,short IP)
2:发送一串字符 //senddata(CString data)
3:关闭socket //closesocket()
4:必须是长连接,可以随时发送数据,如果发现服务器关闭,那必须重新连接,只有客户自己关闭时才能正常关闭

如果发现服务器端断开,重新连接,我用的是goto语句(对吧???)
部分代码:
socketstart:
StartEnv(); //建立初始环境
sockClient=socket(AF_INET,SOCK_STREAM,0);
..................
closesocket(sockClient);
WSACleanup();
Sleep(1000);
if(false==IsNormalClose)
goto socketstart; //异常断开时,重新连接

自己粗略了做了win32 application程序原测试文件,没问题
但做成dll文件一调试程序就死
现在怀疑是不是应该用多线程设计?

如果有问题,底下应该还开一个帖子,关于代码的调试?一知半解,真是难过:(
...全文
403 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Pro_X 2009-11-24
  • 打赏
  • 举报
回复
有一定难度
flyskytoday 2009-04-28
  • 打赏
  • 举报
回复
还有,长连接,,,是不是要消耗大量资源???程序是不是就停在这不动了???什么方法做比较好
flyskytoday 2009-04-28
  • 打赏
  • 举报
回复
以前做过的人好象不太多
现在还没调试出来,真难过。。。
nodiebirdcomeback 2009-04-28
  • 打赏
  • 举报
回复
为什么要多次调用这个WSACleanup();
nodiebirdcomeback 2009-04-28
  • 打赏
  • 举报
回复
WSACleanup();
xghuzd 2009-04-28
  • 打赏
  • 举报
回复
我想可能是DLL的设计和使用的问题.
flyskytoday 2009-04-28
  • 打赏
  • 举报
回复
那请问一下楼上兄弟,,,,如何改呢?
现在真的想不出什么办法
lijinfenghust 2009-04-28
  • 打赏
  • 举报
回复
你这 OpenSocket和界面在同一线程,
如果connet失败了,会一直执行OpenSocket,界面就没法对其他消息响应了,那铁定死啊。

flyskytoday 2009-04-28
  • 打赏
  • 举报
回复
现在怀疑自己的思路是不是有问题~~~
没有好好看过代码,自己又没做过
flyskytoday 2009-04-28
  • 打赏
  • 举报
回复
晕啊,,,看大家这么辛苦帮忙,,,我想加到100分
居然提示。。。此帖发帖1天后才允许加分

只好明天再加
flyskytoday 2009-04-28
  • 打赏
  • 举报
回复
一直在找原因,,,在调
自己实在没有这能力解决问题,连按一下OnButton_open都死
还是请大家帮忙解决一下,,,
=============================
调用DLL的EXE按键代码
-----------------
HINSTANCE hInst;
void CExeTestDlg::OnButton_open()
{
hInst=LoadLibrary("SocketDll.dll");
typedef void (*open)(CString a,short b);
open Opensocket;
Opensocket=(open)GetProcAddress(hInst,"OpenSocket");
Opensocket("127.0.0.1",6000);
}

void CExeTestDlg::OnButton_send()
{
typedef void (*get)(CString SendBuf);
get Senddata;
Senddata=(get)GetProcAddress(hInst,"SendData");
Senddata("123456");
}

void CExeTestDlg::OnButton_close()
{
typedef void (*close)();
close Closesocket;
Closesocket=(close)GetProcAddress(hInst,"CloseSocket");
Closesocket();
FreeLibrary(hInst);
}
=========================
Dll代码
----------------

#include <afx.h>
#include <Winsock2.h>
#pragma comment(lib, "WS2_32")
void StartEnv();
void SendData(CString SendBuf);
bool SocketClose=false;
CString SendDataBuf;
SOCKET sockClient;

void OpenSocket(CString SerAddress,short SerPort)
{
socketstart:
StartEnv(); //建立初始环境
SendDataBuf.Empty();
sockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr(SerAddress);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(SerPort);
if(INVALID_SOCKET == connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)))
{
closesocket(sockClient);
WSACleanup();
Sleep(1000);
if(false==SocketClose)
goto socketstart;
}

while (1)
{
if(SendDataBuf.GetLength()>5)
if(0 > send(sockClient,SendDataBuf,strlen(SendDataBuf)+1,0))
send(sockClient,SendDataBuf,strlen(SendDataBuf)+1,0);
if(10054==WSAGetLastError())
{
closesocket(sockClient);
WSACleanup();
Sleep(1000);
if(false==SocketClose)
goto socketstart;
}
SendDataBuf.Empty();
Sleep(1000);
}
closesocket(sockClient);
WSACleanup();
Sleep(1000);
if(false==SocketClose)
goto socketstart; //异常断开时,重新连接
}
void SendData(CString SendBuf)
{
if(SendBuf.GetLength()>0)
SendDataBuf=SendBuf;
SendBuf.Empty();
}

void CloseSocket()
{
SocketClose=true; //正常关闭socket
closesocket(sockClient);
WSACleanup();
exit(-1);
}

void StartEnv()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
exit(-1);
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
exit(-1);
}
}
还没淹死的鱼 2009-04-28
  • 打赏
  • 举报
回复
connect阻塞了吧?
写日志, 或加printf, 调试没什么难的

长连接太多对服务器压力很大, 除非你的服务器受得了
lijinfenghust 2009-04-28
  • 打赏
  • 举报
回复
Sleep(10000);//睡觉了,怎么还一直占CPU?
怎么一直占得CPU我不清楚 ,但是如果只有1个线程,这里又睡这么长时间 那就比较危险了,会造成程序假死现象。

如果你的程序是个console的,那建议
你把这个 connect换到另外一个线程里面去做吧。

如果是个界面的 ,可以考虑用定时器就行。
flyskytoday 2009-04-28
  • 打赏
  • 举报
回复
if(INVALID_SOCKET == connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)))
{
closesocket(sockClient);
WSACleanup();
Sleep(10000);//睡觉了,怎么还一直占CPU?
if(false==SocketClose)
goto socketstart;//调了,应该是这一句,没连接上测试程序一直在找Sleep睡觉也没用
}
lijinfenghust 2009-04-28
  • 打赏
  • 举报
回复
但做成dll文件一调试程序就死

用调试环境的中断所有线程 ,看看程序死在什么地方。分析一下原因比较好
princewwj 2009-04-28
  • 打赏
  • 举报
回复
用线程做比较好。

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧