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