Re: Winsock Control
"clinisbut" <clinisbut@gmail.com> wrote in message
news:faa3a9eb-cea0-4965-adb0-d3b13dad82af@n20g2000hsh.googlegroups.com...
Well, after investigating in the morning I could write this code to
try the CAsyncSocket.
I'm blocked in receiving the data, CAsyncSocket.receive returns a -1
error and calling GetLastError can't
get any details of what is failing.
I've created a new class that wraps CAsyncSocket (MySocket).
In my app header ( CUart2Dlg ) I create two instances of MySocket
( m_SocketServer and m_SocketListener ).
Inside MySocket I throw the events to the CUart2Dlg to write there the
code.
Here the definition of my class Dialog:
<CODE>
class CUart2Dlg : public CDialog
{
// Construction
public:
CUart2Dlg(CWnd* pParent = NULL); // standard constructor
void OnAccept();
void OnClose();
void OnRecieve();
// [...]
private:
MySocket m_SocketServer;
MySocket m_SocketListener;
// [...]
</CODE>
This is my initDialog application:
<CODE>
BOOL CUart2Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this
automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
//MINE
m_SocketServer.SetParentDlg( this );
m_SocketListener.SetParentDlg( this );
return TRUE; // return TRUE unless you set the focus to a control
}
</CODE>
And the event handlers:
<CODE>
void CUart2Dlg::OnClickOpenServer()
{
// TODO: Add your control notification handler code here
UpdateData(true);
m_SocketServer.Create( m_iTcpPort );
//Empezamos a escuchar
if( m_SocketServer.Listen()==FALSE )
{
AfxMessageBox( "Unable to listen on that port, please try another
port" );
m_SocketServer.Close();
return;
}
addString( IDC_TCPDEBUG, _T("Waiting for conection...\r\n") );
}
void CUart2Dlg::OnAccept()
{
CString strIP;
UINT port;
if(m_SocketServer.Accept( m_SocketListener ) )
{
m_SocketServer.GetSockName( strIP, port );
addString( IDC_TCPDEBUG, _T("Client connected: " + strIP+"\r\n" ) );
m_SocketServer.Send("Connected To Server",strlen("Connected To
Server"));
}
else
{
AfxMessageBox("Cannoot Accept Connection");
}
}
===============================================
There are several problems here...
The listening socket (m_SocketServer) does one thing only: It accepts
connections. It does not send or receive any data. It does not receive the
GetSockName info.
The socket that you pass to Accept (which you have misnamed
m_SocketListener) should be dynamically created with new. That will let you
accept more than one connection, and also prevent you from reusing the first
socket (which is very good practice).
=============================================
//Al recibir datos
void CUart2Dlg::OnRecieve()
{
//char *pBuf =new char [1025];
unsigned char* pBuf[100];
CString strData;
int iLen;
iLen = m_SocketServer.Receive( pBuf,100 );
/*
strData.Format( _T("Data length recieved:%d"), iLen );
MessageBox( strData );
*/
if(iLen==SOCKET_ERROR)
{
AfxMessageBox("Could not Recieve");
strData.Format( _T("Error: %d"),m_SocketServer.GetLastError() ); //
<---Returns 0
}
else
{
AfxMessageBox( "Yes");
}
}
</CODE>
================================================
Again, you are calling the wrong socket's Receive function. The
CAsyncSocket::OnReceive function has a parameter which you should pass along
and check: it informs you of some disconnections.
If you get an error in iLen, immediately call GetLastError. Doing anything
else destroys the error information.
Also get rid of the message boxes. They can be fatal in OnReceive, because
while they are displayed they run a message pump, which can let another call
into OnReceive, causing reentry.
Why don't you start with one of the MFC CAsyncSocket sample programs?
--
Scott McPhillips [VC++ MVP]