首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

SOCKET编程,第二次建立不成功?问!解决思路

2012-02-14 
SOCKET编程,第二次建立不成功?急问!!网络监控程序服务端,两个按纽,一个“运行”,一个“停止”。运行:建立SOCKET

SOCKET编程,第二次建立不成功?急问!!
网络监控程序服务端,两个按纽,一个“运行”,一个“停止”。


运行:建立SOCKET连接,并监听客户端连接;
停止:关闭SOCKET连接。


问题:
第一次点击“运行”按纽,可以成功建立SOCKET。“停止”后,再次点击“运行”按纽,则出现SOCKET建立失败。


//运行
void   __fastcall   TfMain::btn_RunClick(TObject   *Sender)
{
if(   FALSE   ==   InitWinSock()   )               //第二次“运行”,InitWinSock()老是返回FALSE。
{
                                Application-> MessageBox( "Socket建立失败! ",   "错误 ",   MB_OK   +
                                                                                MB_ICONINFORMATION);
                                return;
}

                DWORD   dwThreadId;  
                g_hThread   =   CreateThread(NULL,   0,   ServerThread,   NULL,   0,   &dwThreadId);
if(   NULL   ==   g_hThread   )
{
                                Application-> MessageBox( "建立接收线程失败! ",   "错误 ",   MB_OK   +
                                                                                MB_ICONINFORMATION);
return;
}

                btn_Run-> Enabled   =   false;
                btn_Stop-> Enabled   =   true;
}


//---------------------------------------
//停止
void   __fastcall   TfMain::btn_StopClick(TObject   *Sender)
{
            /*   终止socket服务线程   */
if(   g_hThread   !=   NULL   )
{
(void)TerminateThread(   g_hThread,   0   );
g_hThread   =   NULL;
}

if(   g_ListenSocket   !=   INVALID_SOCKET   )
              {
(void)closesocket(   g_ListenSocket   );
g_ListenSocket   =   INVALID_SOCKET;
              }

//终止用户使用Ws2_32.dll库
(void)WSACleanup();

                btn_Run-> Enabled   =   true;
                btn_Stop-> Enabled   =   false;
}


/////////////////////////////////////////////////////////

BOOL   InitWinSock()
{
struct   sockaddr_in   sockAddr;//本地套接字地址
int   iErr;

if(   FALSE   ==   InitSockDLL()   )
{
return   FALSE;
}

//建立Socket
g_ListenSocket   =   WSASocket(   AF_INET,   SOCK_STREAM,   0,   NULL,   0,   WSA_FLAG_OVERLAPPED   );


if(   INVALID_SOCKET   ==   g_ListenSocket   )
{
return   FALSE;
}

//为Socket绑定地址
memset(   &sockAddr,   0,   sizeof(   sockAddr   )   );
sockAddr.sin_family   =   AF_INET;
sockAddr.sin_addr.S_un.S_addr   =   INADDR_ANY;
sockAddr.sin_port   =   htons(   LISTEN_DEFAULT_PORT   );        
iErr   =   bind(   g_ListenSocket,   (LPSOCKADDR)&sockAddr,   sizeof(   sockAddr   )   );
if(   SOCKET_ERROR   ==   iErr   )
{
(void)closesocket(   g_ListenSocket   );
g_ListenSocket   =   INVALID_SOCKET;

return   FALSE;
}

//开始监听(默认监听100个连接)
iErr   =   listen(   g_ListenSocket,   100   );
if(   SOCKET_ERROR   ==   iErr   )
{
(void)closesocket(   g_ListenSocket   );
g_ListenSocket   =   INVALID_SOCKET;

return   FALSE;
}

return   TRUE;
}




[解决办法]
用 WSAGetLastError 看一下
[解决办法]
你为什么要按2次,第一已经bind一个地址,再按一次自然有错误,一个地址只能bind一次。
在第一按下成功后应该将按钮的Enabled设置为false,知道你按下停止
[解决办法]
WSAGetLastError,
查返回值,如果有MSDN就直接查,没有就上网查.

qiufen123()
你收到的数据在 recv的buf中,就是一块内存.想怎么保存都可以啊.

热点排行