cwSocket.h/cpp, main.cpp : Updates to socksrv::test().

This commit is contained in:
kpl 2020-03-18 14:08:21 -04:00
parent be5ae7e63e
commit 49bec1142f
3 changed files with 81 additions and 49 deletions

View File

@ -415,7 +415,7 @@ namespace cw
// ... and connect this socket to the remote address/port // ... and connect this socket to the remote address/port
if( connect(s->sockH, (struct sockaddr*)&addr, sizeof(addr)) == cwSOCKET_SYS_ERR ) if( connect(s->sockH, (struct sockaddr*)&addr, sizeof(addr)) == cwSOCKET_SYS_ERR )
return cwLogSysError(kOpFailRC, errno, "Socket connect failed." ); return cwLogSysError(kOpFailRC, errno, "Socket connect to %s:%i failed.", cwStringNullGuard(remoteAddr), remotePort );
s->flags = cwSetFlag(s->flags,kIsConnectedFl); s->flags = cwSetFlag(s->flags,kIsConnectedFl);
@ -817,7 +817,7 @@ cw::rc_t cw::sock::send( handle_t h, unsigned userId, unsigned connId, const voi
return rc; return rc;
// If this a pre-connected socket ... // If this a pre-connected socket ...
if( cwIsFlag(s->flags,kIsConnectedFl) ) if( cwIsFlag(s->flags,kIsConnectedFl) )
{ {
if( ::send( s->sockH, data, dataByteCnt, 0 ) == cwSOCKET_SYS_ERR ) if( ::send( s->sockH, data, dataByteCnt, 0 ) == cwSOCKET_SYS_ERR )
rc = cwLogSysError(kOpFailRC,errno,"Send failed."); rc = cwLogSysError(kOpFailRC,errno,"Send failed.");
@ -1094,14 +1094,14 @@ namespace cw
return true; return true;
} }
void _socketCbFunc( void* cbArg, sock::cbId_t cbId, unsigned userId, unsigned connId, const void* byteA, unsigned byteN, struct sockaddr_in* srcAddr ) void _socketTestCbFunc( void* cbArg, sock::cbId_t cbId, unsigned userId, unsigned connId, const void* byteA, unsigned byteN, struct sockaddr_in* srcAddr )
{ {
rc_t rc; rc_t rc;
char buf[ INET_ADDRSTRLEN+1 ]; char addr[ INET_ADDRSTRLEN+1 ];
if((rc = sock::addrToString( srcAddr, buf, INET_ADDRSTRLEN )) == kOkRC ) if((rc = sock::addrToString( srcAddr, addr, INET_ADDRSTRLEN )) == kOkRC )
{ {
printf("user:%i %s %s\n", userId, (const char*)byteA, buf ); printf("from user:%i conn:%i at %s : %s ", userId, connId, addr, (const char*)byteA );
} }
} }
@ -1166,24 +1166,30 @@ cw::rc_t cw::socksrv::stop( handle_t h )
return thread::pause( p->thH ); return thread::pause( p->thH );
} }
cw::rc_t cw::socksrv::test( sock::portNumber_t localPort, const char* remoteAddrIp, sock::portNumber_t remotePort ) cw::rc_t cw::socksrv::test( sock::portNumber_t localPort, const char* remoteAddrIp, sock::portNumber_t remotePort, unsigned flags )
{ {
handle_t h; handle_t h;
rc_t rc = kOkRC; rc_t rc = kOkRC;
unsigned timeOutMs = 50; unsigned timeOutMs = 50;
unsigned recvBufByteN = 2048; unsigned recvBufByteN = 2048;
unsigned maxSocketN = 10; unsigned maxSocketN = 10;
unsigned userId = 10; unsigned userId = 10;
unsigned sockFlags = sock::kNonBlockingFl; unsigned sockFlags = sock::kNonBlockingFl | flags;
bool serverFl = remoteAddrIp == nullptr;
const unsigned sbufN = 31; const unsigned sbufN = 31;
char sbuf[ sbufN+1 ]; char sbuf[ sbufN+1 ];
// create the socket server if( serverFl )
printf("Server listening on port: %i\n", localPort );
else
printf("Client connecting to server %s:%i\n", remoteAddrIp,remotePort);
// create the socket manager
if((rc = createMgrSrv(h, timeOutMs, recvBufByteN, maxSocketN )) != kOkRC ) if((rc = createMgrSrv(h, timeOutMs, recvBufByteN, maxSocketN )) != kOkRC )
return cwLogError(rc,"Socket server create failed."); return cwLogError(rc,"Socket server create failed.");
// start the socket server // start the socket manager
if((rc = start(h)) != kOkRC ) if((rc = start(h)) != kOkRC )
{ {
cwLogError(rc,"Socker server start failed."); cwLogError(rc,"Socker server start failed.");
@ -1191,13 +1197,13 @@ cw::rc_t cw::socksrv::test( sock::portNumber_t localPort, const char* remoteAdd
} }
// create a socket // create a socket
if((rc = create( mgrHandle(h), userId, localPort, sockFlags, timeOutMs, _socketCbFunc, nullptr, remoteAddrIp, remotePort)) != kOkRC ) if((rc = create( mgrHandle(h), userId, localPort, sockFlags, timeOutMs, _socketTestCbFunc, nullptr, remoteAddrIp, remotePort)) != kOkRC )
{ {
cwLogError(rc,"Socket server socket create failed."); cwLogError(rc,"Socket server socket create failed.");
goto errLabel; goto errLabel;
} }
printf("quit\n"); printf("'quit' to exit\n");
// readline loop // readline loop
while( true ) while( true )
@ -1229,11 +1235,17 @@ cw::rc_t cw::socksrv::test( sock::portNumber_t localPort, const char* remoteAdd
return rcSelect(rc,rc1,rc2); return rcSelect(rc,rc1,rc2);
} }
cw::rc_t cw::socksrv::testServer( sock::portNumber_t localPort ) cw::rc_t cw::socksrv::testMain( bool tcpFl, sock::portNumber_t localPort, const char* remoteAddrIp, sock::portNumber_t remotePort )
{ {
return test(localPort,nullptr,sock::kInvalidPortNumber); unsigned flags = 0;
}
cw::rc_t cw::socksrv::testClient( sock::portNumber_t localPort, const char* remoteAddrIp, sock::portNumber_t remotePort ) if( tcpFl )
{ {
return test(localPort,remoteAddrIp,remotePort); flags |= sock::kTcpFl | sock::kStreamFl | sock::kReuseAddrFl | sock::kReusePortFl;
if( remoteAddrIp == nullptr )
flags |= sock::kListenFl;
}
return test(localPort,remoteAddrIp,remotePort,flags);
} }

View File

@ -17,8 +17,9 @@ namespace cw
} cbId_t; } cbId_t;
// userId is the id assigned to a socket created with kStreamFl | kListenFl
// connId is an automatically id which is assigned to represent the remote endpoint which is connected to 'userId'. // userId is the id assigned to the receiving socket
// connId is an automatically assigned id which represents the remote endpoint which is connected to 'userId'.
typedef void (*callbackFunc_t)( void* cbArg, cbId_t cbId, unsigned userId, unsigned connId, const void* byteA, unsigned byteN, struct sockaddr_in* srcAddr ); typedef void (*callbackFunc_t)( void* cbArg, cbId_t cbId, unsigned userId, unsigned connId, const void* byteA, unsigned byteN, struct sockaddr_in* srcAddr );
enum enum
@ -131,9 +132,8 @@ namespace cw
rc_t start( handle_t h ); rc_t start( handle_t h );
rc_t stop( handle_t h ); rc_t stop( handle_t h );
rc_t test( sock::portNumber_t localPort, const char* remoteAddrIp, sock::portNumber_t remotePort ); rc_t test( sock::portNumber_t localPort, const char* remoteAddrIp, sock::portNumber_t remotePort, unsigned flags=0 );
rc_t testServer( sock::portNumber_t localPort ); rc_t testMain( bool tcpFl, sock::portNumber_t localPort, const char* remoteAddrIp=nullptr, sock::portNumber_t remotePort=sock::kInvalidPortNumber );
rc_t testClient( sock::portNumber_t localPort, const char* remoteAddrIp, sock::portNumber_t remotePort );
} }
} }

View File

@ -204,31 +204,52 @@ void socketSrvTcpTest( cw::object_t* cfg, int argc, const char* argv[] )
} }
} }
void sockServerTest( cw::object_t* cfg, int argc, const char* argv[] ) void sockMgrTest( cw::object_t* cfg, int argc, const char* argv[] )
{ {
if( argc >= 2 ) bool tcpFl = false;
unsigned short localPort = 0;
const char* remoteIp = nullptr;
unsigned short remotePort = 0;
if( argc <3 )
{ {
unsigned short localPort = atoi(argv[1]); printf("Invalid argument count.");
printf("Usage: ./cw_rt <cfg_fn> 'udp | tcp' <localPort> { <remote_ip> <remote_port> }\n");
printf("local port:%i\n", localPort ); goto errLabel;
cw::socksrv::testServer( localPort );
} }
}
void sockClientTest( cw::object_t* cfg, int argc, const char* argv[] )
{
if( argc >= 4 ) if( argc >= 4 )
{ {
unsigned short localPort = atoi(argv[1]); remoteIp = argv[3];
const char* remoteIp = argv[2];
unsigned short remotePort = atoi(argv[3]);
printf("local:%i to remote:%s %i\n", localPort, remoteIp, remotePort); if( argc >= 5 )
remotePort = atoi(argv[4]);
cw::socksrv::testClient(localPort, remoteIp, remotePort );
} }
if( strcmp(argv[1],"tcp")!=0 && strcmp(argv[1],"udp")!=0 )
{
printf("The first argument must be 'udp' or 'tcp'\n");
goto errLabel;
}
tcpFl = strcmp(argv[1],"tcp")==0;
localPort = atoi(argv[2]);
if( remoteIp != nullptr && remotePort == 0 )
{
printf("A remote adddress '%s' was given but no remote port was given.", remoteIp);
goto errLabel;
}
printf("style:%s local:%i to remote:%s %i\n", argv[1], localPort, cwStringNullGuard(remoteIp), remotePort);
cw::socksrv::testMain( tcpFl, localPort, remoteIp, remotePort );
errLabel:
return;
} }
void socketMdnsTest( cw::object_t* cfg, int argc, const char* argv[] ) void socketMdnsTest( cw::object_t* cfg, int argc, const char* argv[] )
@ -316,8 +337,7 @@ int main( int argc, const char* argv[] )
{ "socketTcp", socketTestTcp }, { "socketTcp", socketTestTcp },
{ "socketSrvUdp", socketSrvUdpTest }, { "socketSrvUdp", socketSrvUdpTest },
{ "socketSrvTcp", socketSrvTcpTest }, { "socketSrvTcp", socketSrvTcpTest },
{ "sockServer", sockServerTest }, { "sockMgrTest", sockMgrTest },
{ "sockClient", sockClientTest },
{ "socketMdns", socketMdnsTest }, { "socketMdns", socketMdnsTest },
{ "dnssd", dnsSdTest }, { "dnssd", dnsSdTest },