I need CSocket help please. (Questioin clarified)
Scott Andrew -- sandrew@pacbell.net
Saturday, January 18, 1997
Environment: VC++ 4.2-flat, Win 95
I have a few questions about using CSocket for syncronous usage..
Question 1
--------------
I am creating an application that needs to FTP but not supply UI when
connecting. I have overridden CSocket to give me to wrap fucntionality.
I have a SendCommand function that sends a command to a server and reads
from the socket until it's done. Then it returns TRUE or FALSE depending on
what comes back from the server. In my SendCommand I have a Recieve and I
need to keep reading until there is no more data to read. My current code
looks something like this (It's just the part in question):
bResult = Send(szCommand, szCommand.Length())
if (bResult)
{
do
{
Ioctl(FIONREAD, &dwBytes);
if (dwBytes != 0)
{
char szBuffer[1024] = "";
bytesRead = Recieve(szBuffer, 1024);
if (bytesRead != SOCKET_ERROR)
szReply += szBufer;
else
bResult = FALSE;
}
}while (bResult && dwBytes);
}
if (bResult)
bResult = ProcessReply(nCmd, szReply);
return bResult;
Becuase of the nature I really want this to be fully syncronous.. Is this
the best way to keep reading until there is no more data if I am not using
Asyncronous sockets?
Question 2
--------------
What is the best way to time out on a CSocket??? Should I set up my own
timer and then close the socket if nothing happends?? I have played with
the WINSOCK API a little. I am being asked to do this in MFC.. I want to be
able to time out on Recieve and Send if they are taking to long. And how do
you detect (On a syncronous socket) when a connecion is lost?? Is it just
when you try to do a Send or Recieve?
Scott Andrew
Simon Coghlan -- coghlans@sharelink.com
Tuesday, January 21, 1997
Scot
--=20
Re Q2:
I have written my own thin wrapper that sits over the WinSock DLL (Ver =
2 as well )..
In this extension DLL I have a command that looks like :-
CBOOL CCoreSock::SetSocketOption( CINT ciOptName, PCSTR cpszOptVal, CINT =
ciOptLen )
{
;;;
// The Windows Sockets setsockopt function sets a socket option.
if ( setsockopt( m_Socket, SOL_SOCKET, ciOptName, cpszOptVal, ciOptLen =
) =3D=3D SOCKET_ERROR )
{
Decode_Error( "SetSocketOption:setsockopt()" );
}
else=20
;;;
} // End CCoreSock::SetSocketOption
This is used to set the Timeouts like this ..
if ( !Get_Error_Status_Flag()
&& (connect( GetSocket(), (PSOCKADDR)&EndPoint_Address, sizeof( =
EndPoint_Address ) ) =3D=3D SOCKET_ERROR)
)
{
Decode_Error( "Connect:connect()" );
}
else=20
{=09
if ( SetSocketOption( SO_SNDTIMEO, (char *)&iSend_TimeOut, sizeof( =
iSend_TimeOut ) )=20
&& SetSocketOption( SO_RCVTIMEO, (char *)&iRecieve_TimeOut, sizeof( =
iRecieve_TimeOut) )
)
{ // If it got his far then everything is okay
bReturn_Status =3D TRUE;
Decode_Error( "CTalkToGateway::Connect" );
// m_iLast_Error_Value =3D 0;
}
}
connect and setsockopt are WinSock Api's that are documented.. There =
should be an implementation that works with the classes that yoou are =
using..
The reason that I wrote my own wrapper, was to use the TCP stuff in a =
console app and to get timeouts working under MFC 4.1x..
---------
Simon=20
----------<- Smurf-IV ->-------------
Tel : 0121 200 7713
Fax : +44 (0)121 212 0379
Email smurf-iv@sharelink.com
Member of the 'Team of CIS' ;-)
---------<- Fun To All ->------------
We are what we repeatedly do, Excellence, then, is not an act, but a =
habit.
Aristotle
The one who says it cannot be done, should never interrupt the one who =
is doing it.
The Roman Rule
On 18 January 1997 22:12, Scott Andrew wrote:
> Environment: VC++ 4.2-flat, Win 95
>=20
> =20
> I have a few questions about using CSocket for synchronous usage..=20
>=20
> Question 1
> --------------
> I am creating an application that needs to FTP but not supply UI when
> connecting. I have overridden CSocket to give me to wrap =
functionality.
>=20
> I have a SendCommand function that sends a command to a server and =
reads
> from the socket until it's done. Then it returns TRUE or FALSE =
depending on
> what comes back from the server. In my SendCommand I have a Receive =
and I
> need to keep reading until there is no more data to read. My current =
code
> looks something like this (It's just the part in question):
>=20
> bResult =3D Send(szCommand, szCommand.Length())
>=20
> if (bResult)
> {
> do
> {
> Ioctl(FIONREAD, &dwBytes);
>=20
> if (dwBytes !=3D 0)
> {
> char szBuffer[1024] =3D "";
> bytesRead =3D Recieve(szBuffer, 1024);
>=20
> if (bytesRead !=3D SOCKET_ERROR)
> szReply +=3D szBufer;
> else
> bResult =3D FALSE;
> }
> }while (bResult && dwBytes);
> }
>=20
> if (bResult)
> bResult =3D ProcessReply(nCmd, szReply);
>=20
> return bResult;
>=20
> Becuase of the nature I really want this to be fully syncronous.. Is =
this
> the best way to keep reading until there is no more data if I am not =
using
> Asyncronous sockets?
>=20
> Question 2
> --------------
> What is the best way to time out on a CSocket??? Should I set up my =
own
> timer and then close the socket if nothing happends?? I have played =
with
> the WINSOCK API a little. I am being asked to do this in MFC.. I want =
to be
> able to time out on Recieve and Send if they are taking to long. And =
how do
> you detect (On a syncronous socket) when a connecion is lost?? Is it =
just
> when you try to do a Send or Recieve?
>=20
> Scott Andrew=20
Simon Coghlan -- coghlans@sharelink.com
Tuesday, January 21, 1997
Scot
--=20
Re Q2:
I have written my own thin wrapper that sits over the WinSock DLL (Ver =
2 as well )..
In this extension DLL I have a command that looks like :-
CBOOL CCoreSock::SetSocketOption( CINT ciOptName, PCSTR cpszOptVal, CINT =
ciOptLen )
{
;;;
// The Windows Sockets setsockopt function sets a socket option.
if ( setsockopt( m_Socket, SOL_SOCKET, ciOptName, cpszOptVal, ciOptLen =
) =3D=3D SOCKET_ERROR )
{
Decode_Error( "SetSocketOption:setsockopt()" );
}
else=20
;;;
} // End CCoreSock::SetSocketOption
This is used to set the Timeouts like this ..
if ( !Get_Error_Status_Flag()
&& (connect( GetSocket(), (PSOCKADDR)&EndPoint_Address, sizeof( =
EndPoint_Address ) ) =3D=3D SOCKET_ERROR)
)
{
Decode_Error( "Connect:connect()" );
}
else=20
{=09
if ( SetSocketOption( SO_SNDTIMEO, (char *)&iSend_TimeOut, sizeof( =
iSend_TimeOut ) )=20
&& SetSocketOption( SO_RCVTIMEO, (char *)&iRecieve_TimeOut, sizeof( =
iRecieve_TimeOut) )
)
{ // If it got his far then everything is okay
bReturn_Status =3D TRUE;
Decode_Error( "CTalkToGateway::Connect" );
// m_iLast_Error_Value =3D 0;
}
}
connect and setsockopt are WinSock Api's that are documented.. There =
should be an implementation that works with the classes that yoou are =
using..
The reason that I wrote my own wrapper, was to use the TCP stuff in a =
console app and to get timeouts working under MFC 4.1x..
---------
Simon=20
----------<- Smurf-IV ->-------------
Tel : 0121 200 7713
Fax : +44 (0)121 212 0379
Email smurf-iv@sharelink.com
Member of the 'Team of CIS' ;-)
---------<- Fun To All ->------------
We are what we repeatedly do, Excellence, then, is not an act, but a =
habit.
Aristotle
The one who says it cannot be done, should never interrupt the one who =
is doing it.
The Roman Rule
On 18 January 1997 22:12, Scott Andrew wrote:
> Environment: VC++ 4.2-flat, Win 95
>=20
> =20
> I have a few questions about using CSocket for synchronous usage..=20
>=20
> Question 1
> --------------
> I am creating an application that needs to FTP but not supply UI when
> connecting. I have overridden CSocket to give me to wrap =
functionality.
>=20
> I have a SendCommand function that sends a command to a server and =
reads
> from the socket until it's done. Then it returns TRUE or FALSE =
depending on
> what comes back from the server. In my SendCommand I have a Receive =
and I
> need to keep reading until there is no more data to read. My current =
code
> looks something like this (It's just the part in question):
>=20
> bResult =3D Send(szCommand, szCommand.Length())
>=20
> if (bResult)
> {
> do
> {
> Ioctl(FIONREAD, &dwBytes);
>=20
> if (dwBytes !=3D 0)
> {
> char szBuffer[1024] =3D "";
> bytesRead =3D Recieve(szBuffer, 1024);
>=20
> if (bytesRead !=3D SOCKET_ERROR)
> szReply +=3D szBufer;
> else
> bResult =3D FALSE;
> }
> }while (bResult && dwBytes);
> }
>=20
> if (bResult)
> bResult =3D ProcessReply(nCmd, szReply);
>=20
> return bResult;
>=20
> Becuase of the nature I really want this to be fully syncronous.. Is =
this
> the best way to keep reading until there is no more data if I am not =
using
> Asyncronous sockets?
>=20
> Question 2
> --------------
> What is the best way to time out on a CSocket??? Should I set up my =
own
> timer and then close the socket if nothing happends?? I have played =
with
> the WINSOCK API a little. I am being asked to do this in MFC.. I want =
to be
> able to time out on Recieve and Send if they are taking to long. And =
how do
> you detect (On a syncronous socket) when a connecion is lost?? Is it =
just
> when you try to do a Send or Recieve?
>=20
> Scott Andrew=20
| Вернуться в корень Архива
|