[complement-svn] SF.net SVN: complement: [1879] trunk/complement/explore/app/SMTP-tools/ smtp_serve
Status: Pre-Alpha
Brought to you by:
complement
From: <oke...@us...> - 2008-05-22 14:27:05
|
Revision: 1879 http://complement.svn.sourceforge.net/complement/?rev=1879&view=rev Author: okechina Date: 2008-05-22 07:26:19 -0700 (Thu, 22 May 2008) Log Message: ----------- Socket class is created, ECHO server and client use the class. Only one client can connect at once (server does not support parallel work) Added Paths: ----------- trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/ trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/ECHO_server.cc trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/Makefile trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/client.cc trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/socket.cc trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/socket.h Added: trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/ECHO_server.cc =================================================================== --- trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/ECHO_server.cc (rev 0) +++ trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/ECHO_server.cc 2008-05-22 14:26:19 UTC (rev 1879) @@ -0,0 +1,44 @@ +#include <sys/types.h> +#include <sys/socket.h> + +#include <netinet/in.h> + +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <iostream> + +#include "socket.h" + +const int bufsize = 4096; + +int main() +{ + struct sockaddr_in fsin; + + char *service = "3000"; +// char *transport = "udp"; + char *transport = "tcp"; + int qlen = 0; + char buf[bufsize]; + + sct::sock s ( service, transport, qlen ); + unsigned int alen; + if (transport == "tcp") + { + alen = sizeof( fsin ); + int sc = accept( s.getDescr(), (struct sockaddr *)&fsin, &alen); + + while (1){ + int cc = read( sc, buf, sizeof( buf ) ); + write( sc, buf, cc ); + } + } else { + while (1){ + alen = sizeof( fsin ); + recvfrom( s.getDescr(), buf, sizeof( buf ), 0, (struct sockaddr *)&fsin, &alen ); + sendto( s.getDescr(), buf, sizeof( buf ), 0, (struct sockaddr *)&fsin, sizeof( fsin ) ); + } + } + return 0; +} Added: trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/Makefile =================================================================== --- trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/Makefile (rev 0) +++ trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/Makefile 2008-05-22 14:26:19 UTC (rev 1879) @@ -0,0 +1,12 @@ +all: server client + +server: server.o socket.o + gcc -g -o server server.o socket.o -lstdc++ +server.o: ECHO_server.cc socket.h + gcc -g -c ECHO_server.cc -o server.o +client: client.o socket.o + gcc -g -o client client.o socket.o -lstdc++ +client.o: client.cc socket.h + gcc -g -c client.cc -o client.o +socket.o: socket.cc socket.h + gcc -g -c socket.cc -o socket.o Added: trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/client.cc =================================================================== --- trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/client.cc (rev 0) +++ trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/client.cc 2008-05-22 14:26:19 UTC (rev 1879) @@ -0,0 +1,40 @@ +#include <unistd.h> +#include <stdio.h> +#include <iostream> + +#include <sys/types.h> +#include <sys/socket.h> + +#include <netinet/in.h> +#include <arpa/inet.h> + +#include <stdlib.h> +#include <string.h> +#include <netdb.h> + +#include "socket.h" + +int main(){ + const int linelen = 1000; + char *host = "localhost"; + char *service = "3000"; +// char *transport = "udp"; + char *transport = "tcp"; + char buf[linelen+1]; + int nchars; + + + sct::sock s( service, transport, host ); + + while ( fgets( buf, sizeof( buf ), stdin) ) { + buf[linelen] = '\0'; + + nchars = strlen( buf ); + write( s.getDescr(), buf, nchars ); + buf[0] = '\0'; + int n = read( s.getDescr(), buf, nchars ); + fputs( buf, stdout ); + } + + return 0; +} Added: trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/socket.cc =================================================================== --- trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/socket.cc (rev 0) +++ trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/socket.cc 2008-05-22 14:26:19 UTC (rev 1879) @@ -0,0 +1,75 @@ +#include <sys/types.h> +#include <sys/socket.h> + +#include <netinet/in.h> +#include <arpa/inet.h> + +#include <stdlib.h> +#include <string.h> +#include <netdb.h> +#include <unistd.h> +#include <stdio.h> +#include <iostream> + +#include "socket.h" + +namespace sct +{ + +int sock::connectSock( const char *service, const char *transport, int qlen, char *host) +{ + int s; + memset (&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + + if ( pse = getservbyname( service, transport ) ) + sin.sin_port = pse->s_port; + else if ( ( sin.sin_port = htons( (unsigned short)atoi( service ) ) ) == 0 ) + std::cerr << "error: can't get service entry"; + + ppe = getprotobyname(transport); + if (ppe == 0) + std::cerr << "error: can't get protocol entry"; + + if ( strcmp( transport, "udp" ) == 0 ) + type = SOCK_DGRAM; + else { + type = SOCK_STREAM; + } + + s = socket( PF_INET, type, ppe->p_proto ); + + if (s < 0) + std::cerr << "error: can't create socket"; + + if ( host == "" ) { //server socket is created + sin.sin_addr.s_addr = INADDR_ANY; + int t = bind( s, (struct sockaddr *)&sin, sizeof( sin ) ); +// std::cerr << t << std::endl; + if ( type == SOCK_STREAM ) { + listen(s,qlen); + } + } else { //client socket is created + if ( phe = gethostbyname( host ) ) + memcpy( &sin.sin_addr, phe->h_addr, phe->h_length ); + else sin.sin_addr.s_addr = inet_addr( host ); + int t = connect( s, (struct sockaddr *)&sin, sizeof( sin ) ); +// std::cerr << t << std::endl; + } + + return s; +} + +sock::sock( const char *service, const char *transport, int qlen) { //constructor for server socket + s = connectSock( service, transport, qlen, ""); +} + +sock::sock( const char *service, const char *transport, char *host) { //constructor for client socket + s = connectSock( service, transport, 0, host); +} + +int sock::getDescr() { + return s; +} + +} //namespace sct Added: trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/socket.h =================================================================== --- trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/socket.h (rev 0) +++ trunk/complement/explore/app/SMTP-tools/smtp_server_ut/socket/socket.h 2008-05-22 14:26:19 UTC (rev 1879) @@ -0,0 +1,35 @@ +#include <sys/types.h> +#include <sys/socket.h> + +#include <netinet/in.h> +#include <arpa/inet.h> + +#include <stdlib.h> +#include <string.h> +#include <netdb.h> +#include <unistd.h> +#include <stdio.h> + +namespace sct +{ + +class sock +{ + private: + struct hostent *phe; + struct servent *pse; + struct protoent *ppe; + struct sockaddr_in sin; + int s, type; + + int connectSock( const char *service, const char *transport, int qlen, char *host); + + public: + sock( const char *service, const char *transport, int qlen); //constructor for server socket + sock( const char *service, const char *transport, char *host); //constructor for client socket + ~sock() + {}; + int getDescr(); +}; + +} //namespace sct This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |