: 固定本地端口的CAsyncSocket,重新建立问题。

kkw2006 2007-11-30 08:43:07
程序需要使用固定本地端口的Socket。

第一次连接的:Create, Connect, Close.全部正常,返回值都是成功。

断开后,再次创建同端口的Socket,然后连接时遇到了问题!

Create, Connect. 成功。但是,虽然函数成功了,通过抓包软件发现并没有发出TCP/IP的SYN请求包。所以连接肯定是无法实现的。

这是怎么一回事哪?

主要代码如下:
连接:
m_pSocket = new CEnetSocket( this );
if ( 0 == m_pSocket->Create( nPort, SOCK_STREAM, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE ) )
{。。。。。。。。return; // 创建失败,函数返回。 }
m_pSocket->Connect( sDeviceIP, nDevicePort );

关闭:
if ( m_pSocket != NULL )
{
m_pSocket->Close();
delete m_pSocket;
m_pSocket = NULL;
}

之后再执行连接部分程序就出现了问题。
...全文
164 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
subo86 2008-08-23
  • 打赏
  • 举报
回复
可能是WSANOTINITIALISED,首次create后使用完socket不要cleanup就行了
pkfreedom 2007-12-10
  • 打赏
  • 举报
回复
我也遇到过相同问题

如果在create时指定端口,在close后立刻create同样端口是不行的,但是过一会就没问题

我觉得虽然close了,但是操作系统还没有释放该端口,得过一会才能释放

所以,create时不要指定端口就行了
kkw2006 2007-11-30
  • 打赏
  • 举报
回复
if ( 0 == m_pSocket->Create( nPort[ii], SOCK_STREAM, FD_READ | FD_CLOSE ) )
{
创建失败。。。。
}

群友:现在Socket创建是这样设置的,没发现改变。
kkw2006 2007-11-30
  • 打赏
  • 举报
回复
BOOL bbb = FALSE;
m_pSocket->SetSockOpt( SO_DONTLINGER, &bbb, sizeof(bbb) );

m_pSocket->SetSockOpt( SO_KEEPALIVE, &bbb, sizeof(bbb) );

linger m_sLinger;

m_sLinger.l_onoff = 1; // (在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)

m_sLinger.l_linger = 0; // (容许逗留的时间为0秒)

m_pSocket->SetSockOpt( SO_LINGER, &m_sLinger, sizeof(linger) );

我仿照论坛里面搜索到的帖子,这样修改了,但仍然不对。
这个socket还没有收发过数据,只是Create,然后connect,然后Close,再Create,再Connect。就不连接了。
stivenjia 2007-11-30
  • 打赏
  • 举报
回复
修改使用SOCKET API试验一下之后用WSAGetLastError取错误信息
q44072429 2007-11-30
  • 打赏
  • 举报
回复
我是VC群里的,如果对了就给分。
kkw2006 2007-11-30
  • 打赏
  • 举报
回复
CSocket 也是同样的结果。呼唤那位大虾快出来啊!
kkw2006 2007-11-30
  • 打赏
  • 举报
回复
CEnetSocket 中只是在 OnClose 和 OnConnect 中更新了几个标志。没有其他动作。

下面是代码:
void CEnetSocket::OnClose(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
m_bIsConnect = FALSE;
m_pDoc->OnEnetClose(nErrorCode);
CAsyncSocket::OnClose(nErrorCode);
}

void CEnetSocket::OnConnect(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
switch ( nErrorCode )
{
case 0:
m_bIsConnect = TRUE;
m_pDoc->OnEnetConnect();
break;
case WSAETIMEDOUT:
break;
default:
break;
}
CAsyncSocket::OnConnect(nErrorCode);
}
jameshooo 2007-11-30
  • 打赏
  • 举报
回复
检查 CEnetSocket 类的方法,是否还有未清理干净的东西

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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