标题:[求助]网络连接和关闭的问题
只看楼主
红影
Rank: 1
等 级:新手上路
威 望:2
帖 子:659
专家分:0
注 册:2006-2-22
结帖率:66.67%
 问题点数:0 回复次数:5 
[求助]网络连接和关闭的问题

我这两个函数用来连接和关闭网络接口设备。建立连接的函数有IP和端口做为参数,但是断开连接的函数没有,如果我同时和多台设备建立了连接,断开的时候要怎么做才能单独的断开其中一台设备或多台而不会影响到其它的。

apiStatus __declspec(dllexport) __stdcall DrfNetConnect (CString strIp, int port)
{
CApiSocket1* m_Sock = new CApiSocket1;

if(!m_Sock->Create())
{
m_Sock->ShutDown();
m_Sock->Close();
return -1;
}
else
{
// long tempIp;
// tempIp = inet_addr(strIp);
m_Sock->strIP = strIp;
m_Sock->port = port;
}
// CString tempIp;
// tempIp = "ping " + strIp;
// if(!system(tempIp))
// return -11;
/* ////////////////////////////////////////////
int ret,TimeOut=2000; //设置发送超时6秒
if(::setsockopt(*m_Sock,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
{
return -1;
}
TimeOut=2000;//设置接收超时6秒
if(::setsockopt(*m_Sock,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
{
return -1;
}
//设置非阻塞方式连接
unsigned long ul = 1;
ret = ioctlsocket(*m_Sock, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR)return -1;

/*//////////////////////////////////////////////////////
sockaddr_in destIp;
destIp.sin_family = AF_INET;
destIp.sin_port = htons(port);
destIp.sin_addr.s_addr = inet_addr(strIp);
int Connectflag = m_Sock->Connect((const struct sockaddr*)&destIp,sizeof(destIp));
//SetTimer(hWnd,1,100,NULL);
// unsigned long ul = 1;
// int ret = ioctlsocket(*m_Sock, FIONBIO, (unsigned long*)&ul);
// if(ret==SOCKET_ERROR)return -1;
// SetTimer(hWnd, 1, 1000, (TIMERPROC)Timer2Proc);
//if(!m_Sock->Connect((const struct sockaddr*)&destIp,sizeof(destIp)))
/* struct timeval timeout ;
fd_set r;

FD_ZERO(&r);
FD_SET(*m_Sock, &r);
timeout.tv_sec = 3; //连接超时15秒
timeout.tv_usec =0;
ret = select(*m_Sock+1, 0, &r, 0, &timeout);
if ( ret <= 0 )
{
m_Sock->ShutDown();
::closesocket(*m_Sock);
return ret;
}
*/
if(Connectflag<=0)
{

// KillTimer(hWnd,1);
m_Sock->ShutDown();
m_Sock->Close();
delete m_Sock;
return -1;
}
// KillTimer(hWnd,1);
m_SockList.AddTail(m_Sock);
return drf_ok;
//
}
/*apiStatus ConnectState(CApiSocket1* m_Sock)
{
if(m_Sock->ConnectFlag != 1)
{
m_Sock->Close();
delete m_Sock;
return -2;
}
m_SockList.AddTail(m_Sock);
return drf_ok;
}*/

apiStatus __declspec(dllexport) __stdcall DrfNetDisconnect()
{
if(m_SockList.IsEmpty())
return -1;
while (!m_SockList.IsEmpty())
{
CApiSocket1 *m_Sock =(CApiSocket1*) m_SockList.RemoveHead();
// m_Sock->ConnectFlag = 0;
m_Sock->ShutDown();
m_Sock->Close();
delete m_Sock;
}
m_SockList.RemoveAll();
return drf_ok;
}

搜索更多相关主题的帖子: 网络 Sock 函数 设备 
2007-11-01 15:10
红影
Rank: 1
等 级:新手上路
威 望:2
帖 子:659
专家分:0
注 册:2006-2-22
得分:0 
顶起

生命中,不断有人离开和进入。于是,看见的,看不见了;记住的,遗忘了。
2007-11-02 08:29
Arcticanimal
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:341
专家分:20
注 册:2007-3-17
得分:0 
用一个数组(链表之类的也可以,更简单)维护每个设备的连接套接字在m_SockList中的索引(注意这个索引会随着链表的add和delete改变),断开的时候按照索引去关闭

try new catch
2007-11-02 18:32
红影
Rank: 1
等 级:新手上路
威 望:2
帖 子:659
专家分:0
注 册:2006-2-22
得分:0 

哦 我不懂哦 好像很复杂的
谁帮我改下这段代码吧
我看看具体是怎么实现就明白了


生命中,不断有人离开和进入。于是,看见的,看不见了;记住的,遗忘了。
2007-11-08 10:40
Arcticanimal
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:341
专家分:20
注 册:2007-3-17
得分:0 
apiStatus __declspec(dllexport) __stdcall DrfNetDisconnect()
{
if(m_SockList.IsEmpty())
return -1;
while (!m_SockList.IsEmpty()) 这个循环就是把所有的连接都关闭了,改成按索引值单个删除就行了
{
CApiSocket1 *m_Sock =(CApiSocket1*) m_SockList.RemoveHead();
// m_Sock->ConnectFlag = 0;
m_Sock->ShutDown();
m_Sock->Close();
delete m_Sock;
}
m_SockList.RemoveAll();
return drf_ok;
}

try new catch
2007-11-10 12:36
红影
Rank: 1
等 级:新手上路
威 望:2
帖 子:659
专家分:0
注 册:2006-2-22
得分:0 
啊 不懂哦 怎么改成按索引值单个删除

生命中,不断有人离开和进入。于是,看见的,看不见了;记住的,遗忘了。
2007-11-27 11:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-182551-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.291797 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved