/* minazuki4.c - Don Yang (uguu.org) 07/04/02 */ #ifdef _WIN32 #include #include typedef SOCKET s; DWORD wthread; #define c closesocket #else #include #include #include #include #include #include #include #include #include #include #include typedef int s; pthread_t wthread; #define c close #endif #include #include #include #define r return typedef struct sockaddr* p; int writer_active, size, n = sizeof(struct sockaddr_in), port = 0; s sock, s2; struct sockaddr_in a1, a2; fd_set sset, rset; struct hostent *hostinfo; char readbuffer[1025], writebuffer[1025]; struct timeval timeout; void createsocket(void) { sock = socket(PF_INET, SOCK_STREAM, 0); a2.sin_family = AF_INET; a2.sin_port = htons(port); a2.sin_addr.s_addr = htonl(INADDR_ANY); if( bind(sock, (p)&a2, n) == -1 ) { puts("bind"); sock = -1; } } #ifdef _WIN32 DWORD WINAPI write_loop(void *arg) #else void *write_loop(void *arg) #endif { for(writebuffer[1024] = '\0'; writer_active; send(sock, writebuffer, strlen(writebuffer), 0)) { printf("> "); fgets(writebuffer, 1024, stdin); if( feof(stdin) ) { writer_active = 0; r 0; } } writer_active = 0; r 0; } int main(int argc, char **argv) { #ifdef _WIN32 WSADATA wsadata; if( WSAStartup(2, &wsadata) ) r puts("WSAStartup"); #endif if( argc < 3 ) r printf("%s \n", *argv); if( (hostinfo = gethostbyname(argv[1])) == NULL ) { if( (a1.sin_addr.s_addr = inet_addr(argv[1])) == INADDR_NONE ) r puts("inet_addr"); } else { a1.sin_addr = *(struct in_addr*)hostinfo->h_addr; } createsocket(); if( sock == -1 ) r 1; a1.sin_family = AF_INET; a1.sin_port = htons(port = atoi(argv[2])); if( connect(sock, (p)&a1, n) == -1 ) { c(sock); createsocket(); if( sock == -1 ) r 1; if( listen(sock, 1) == -1 ) { c(sock); r puts("listen"); } FD_ZERO(&sset); FD_SET(sock, &sset); select(FD_SETSIZE, &sset, NULL, NULL, NULL); size = n; s2 = accept(sock, (p)&a1, &size); c(sock); if( s2 == -1 ) r puts("accept"); getpeername(s2, (p)&a1, &n); sock = s2; } printf("Connected to %s:%hd\n", inet_ntoa(a1.sin_addr), ntohs(a1.sin_port)); writer_active = 1; #ifdef _WIN32 CreateThread(NULL, 0, write_loop, NULL, 0, &wthread); #else pthread_create(&wthread, NULL, write_loop, NULL); #endif FD_ZERO(&sset); FD_SET(sock, &sset); for(; writer_active;) { memcpy(&rset, &sset, sizeof(fd_set)); timeout.tv_sec = timeout.tv_usec = 1; select(FD_SETSIZE, &rset, NULL, NULL, &timeout); if( FD_ISSET(sock, &rset) ) { size = recv(sock, readbuffer, 1024, 0); if( size < 1 ) { writer_active = 0; } else { readbuffer[size] = '\0'; printf("\r \r%s> ", readbuffer); fflush(stdout); } } } shutdown(sock, 2); c(sock); putchar(10); #ifdef _WIN32 WSACleanup(); #endif r 0; }