读书人

SOCKET编程第二次建立不成功?问!解

发布时间: 2012-02-14 19:19:19 作者: rapoo

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中,就是一块内存.想怎么保存都可以啊.

读书人网 >C++ Builder

热点推荐