Author: cmihail
Date: Sun Jul 3 22:54:55 2011
New Revision: 52525
URL: http://svn.reactos.org/svn/reactos?rev=52525&view=rev
Log:
[TESTS]
- commit 2 very small and simple test apps to check select functionality
Added:
branches/GSoC_2011/TcpIpDriver/tests/simplesocket/selecttest.cpp (with
props)
branches/GSoC_2011/TcpIpDriver/tests/simplesocket/server_select.c (with
props)
Added: branches/GSoC_2011/TcpIpDriver/tests/simplesocket/selecttest.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/tests/simplesocket/selecttest.cpp?rev=52525&view=auto
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/tests/simplesocket/selecttest.cpp (added)
+++ branches/GSoC_2011/TcpIpDriver/tests/simplesocket/selecttest.cpp
[iso-8859-1] Sun Jul 3 22:54:55 2011
@@ -1,0 +1,152 @@
+#include <stdio.h>
+#include <windows.h>
+#include <winsock2.h>
+
+SOCKET Socket;
+HANDLE thread_handle;
+DWORD thread_id;
+WSANETWORKEVENTS netevents;
+HWND Window;
+UINT_PTR TimerId;
+UINT AppState;
+char towrite[1024], *towrite_ptr = towrite;
+char outpath[1024];
+
+DWORD WINAPI thread(LPVOID data)
+{
+ FILE *f = NULL;
+ DWORD Ret;
+ BOOLEAN done = FALSE;
+ int wrlen, rdlen;
+ struct timeval tv;
+ struct fd_set readable, writable, exception;
+
+ do
+ {
+ FD_ZERO(&readable);
+ FD_ZERO(&writable);
+ FD_ZERO(&exception);
+
+ FD_SET(Socket, &readable);
+ if (*towrite_ptr)
+ FD_SET(Socket,&writable);
+ FD_SET(Socket, &exception);
+
+ tv.tv_sec = 1; tv.tv_usec = 0;
+
+ Ret = select( Socket + 1, &readable, &writable, &exception, &tv
);
+
+ if ( Ret > 0 )
+ {
+ if (FD_ISSET(Socket, &writable))
+ {
+ if (*towrite_ptr)
+ {
+ wrlen = send(Socket, towrite_ptr,
strlen(towrite_ptr), 0);
+ if (wrlen > 0)
+ towrite_ptr += wrlen;
+ else
+ {
+ done = TRUE;
+ }
+ fprintf( stderr, "send: %d bytes\n",
wrlen );
+ }
+ else
+ {
+ fprintf( stderr, "send: finished header
and waiting\n" );
+ }
+ }
+ if (FD_ISSET(Socket, &readable))
+ {
+ if (!f)
+ f = fopen( outpath, "wb" );
+ if (!f)
+ {
+ done = TRUE;
+ }
+ rdlen = recv( Socket, outpath, sizeof(outpath),
0 );
+ if (rdlen > 0)
+ {
+ fwrite( outpath, 1, rdlen, f );
+ fprintf( stderr, "recv: %d bytes\n",
rdlen );
+ }
+ else
+ {
+ fprintf( stderr, "closed socket\n" );
+ done = TRUE;
+ }
+ }
+ if( FD_ISSET(Socket, &exception) )
+ {
+ done = TRUE;
+ }
+ }
+ else if( !Ret )
+ {
+ fprintf( stderr, "timeout\r" ); fflush( stderr );
+ }
+ else
+ {
+ fprintf( stderr, "return from select: %x\n", Ret );
+ }
+ } while( !done );
+
+ //fprintf( stderr, "About to overread the socket: %d\n",
+ // recv( Socket, outpath, sizeof(outpath), 0 ) );
+ fprintf( stderr, "Last error: %d\n", WSAGetLastError() );
+
+ if( f ) fclose( f );
+}
+
+//74.125.224.112 80 / index.html
+
+int main( int argc, char **argv )
+{
+ WSADATA wdata;
+ BOOLEAN got_header = FALSE;
+ MSG msg;
+ INT nbio = 1;
+ sockaddr_in sa = { AF_INET };
+
+ WSAStartup( 0x0101, &wdata );
+
+ if( argc < 5 )
+ {
+ fprintf( stderr, "usage: %s host port path\n", argv[0]);
+ return 1;
+ }
+
+ sa.sin_addr.s_addr = inet_addr( argv[1] );
+ sa.sin_port = htons( atoi( argv[2] ) );
+
+ sprintf( towrite, "GET %s HTTP/1.0\r\n\r\n", argv[3] );
+ strcpy( outpath, argv[4] );
+
+ Socket = socket( AF_INET, SOCK_STREAM, 0 );
+
+ if( ioctlsocket( Socket, FIONBIO, (ULONG *)&nbio ) )
+ {
+ fprintf( stderr, "ioctlsocket: %d\n", WSAGetLastError() );
+ return 1;
+ }
+
+ thread_handle = CreateThread( NULL,
+ 0,
+ (LPTHREAD_START_ROUTINE)thread,
+ NULL,
+ 0,
+ &thread_id );
+
+ fprintf( stderr, "connecting\n" );
+ connect( Socket, (struct sockaddr *)&sa, sizeof(sa) );
+
+ WaitForSingleObject( thread_handle, INFINITE );
+
+ fprintf( stderr, "closing socket\n" );
+ closesocket( Socket );
+
+ WSACleanup();
+
+ return 0;
+}
+
Propchange: branches/GSoC_2011/TcpIpDriver/tests/simplesocket/selecttest.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: branches/GSoC_2011/TcpIpDriver/tests/simplesocket/selecttest.cpp
------------------------------------------------------------------------------
svn:mime-type = text/
Added: branches/GSoC_2011/TcpIpDriver/tests/simplesocket/server_select.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/tests/simplesocket/server_select.c?rev=52525&view=auto
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/tests/simplesocket/server_select.c (added)
+++ branches/GSoC_2011/TcpIpDriver/tests/simplesocket/server_select.c
[iso-8859-1] Sun Jul 3 22:54:55 2011
@@ -1,0 +1,136 @@
+#include <winsock2.h>
+#include <windows.h>
+#include <stdio.h>
+#include <string.h>
+
+#define PORT 54321
+#define DIRSIZE 8192
+
+int main()
+{
+ char dir[DIRSIZE] = {0};
+ int sd, sd_current, ret, rdlen=0;
+ BOOLEAN done = FALSE;
+ int addrlen;
+ struct sockaddr_in sin;
+ struct sockaddr_in pin;
+
+ struct timeval tv;
+ struct fd_set readable, writable, exception;
+ INT nbio = 1;
+
+ WORD version = MAKEWORD(1,1);
+ WSADATA wsaData;
+
+ WSAStartup(version, &wsaData);
+
+ if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ {
+ fprintf(stderr, "socket error\n");
+ exit(1);
+ }
+
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = INADDR_ANY;
+ sin.sin_port = htons(PORT);
+
+ if (bind(sd, (struct sockaddr *) &sin, sizeof(sin)) == -1)
+ {
+ fprintf(stderr, "bind error\n");
+ exit(1);
+ }
+
+ if (listen(sd, 5) == -1)
+ {
+ fprintf(stderr, "listen error\n");
+ exit(1);
+ }
+
+ addrlen = sizeof(pin);
+ if ((sd_current = accept(sd, (struct sockaddr *) &pin, &addrlen)) ==
-1)
+ {
+ fprintf(stderr, "accept error\n");
+ exit(1);
+ }
+
+ if (ioctlsocket(sd_current, FIONBIO, (ULONG *)&nbio))
+ {
+ fprintf(stderr, "ioctlsocket: %d\n", WSAGetLastError());
+ exit(1);
+ }
+
+ fprintf(stdout, "Client connected...waiting for message\n");
+
+ do
+ {
+ FD_ZERO(&readable);
+ FD_ZERO(&writable);
+ FD_ZERO(&exception);
+
+ FD_SET(sd_current, &readable);
+ FD_SET(sd_current,&writable);
+ FD_SET(sd_current, &exception);
+
+ tv.tv_sec = 1; tv.tv_usec = 0;
+
+ ret = select(sd_current + 1, &readable, &writable, &exception,
&tv );
+
+ if (ret>0)
+ {
+ if (FD_ISSET(sd_current, &writable))
+ {
+ /*if (*towrite_ptr)
+ {
+ wrlen = send(sd_current, dir,
strlen(dir), 0);
+ if (wrlen > 0)
+ towrite_ptr += wrlen;
+ else
+ {
+ done = TRUE;
+ }
+ fprintf( stderr, "send: %d bytes\n",
wrlen );
+ }
+ else
+ {
+ fprintf( stderr, "send: finished header
and waiting\n" );
+ }*/
+ }
+ if (FD_ISSET(sd_current, &readable))
+ {
+ fprintf(stdout, "Waiting for recv\n");
+ rdlen = recv(sd_current, dir, sizeof(dir), 0);
+ if (rdlen > 0)
+ {
+ fprintf(stdout, "Message from client:
%s\n", dir);
+ send(sd_current, dir, rdlen, 0);
+ }
+ else
+ {
+ fprintf(stderr, "recv error\n" );
+ }
+
+ done = TRUE;
+ }
+ if (FD_ISSET(sd_current, &exception))
+ {
+ fprintf(stderr, "exception\n");
+ done = TRUE;
+ }
+ }
+ else if (!ret)
+ {
+ fprintf(stderr, "timeout\r" );
+ fflush(stderr);
+ }
+ else
+ {
+ fprintf(stderr, "return from select: %x\n", ret);
+ }
+ } while(!done);
+
+ close(sd);
+ close(sd_current);
+
+ return 0;
+}
Propchange: branches/GSoC_2011/TcpIpDriver/tests/simplesocket/server_select.c
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: branches/GSoC_2011/TcpIpDriver/tests/simplesocket/server_select.c
------------------------------------------------------------------------------
svn:mime-type = text/