#include #include #include #include #include #include #include #include #include #include #define INVALID_SOCKET (-1) #define SOCKET_ERROR (-1) #define MAX_LENGTH 60000 bool stop = false; void * sendThread ( void * args ) { int clientSocket; ssize_t bytesSent = SOCKET_ERROR; char sendBuf[MAX_LENGTH] = ""; clientSocket = *(int *)args; while ( stop == false ) { if ( fgets( sendBuf, sizeof(sendBuf), stdin ) == NULL ) { stop = true; shutdown( clientSocket, SHUT_RDWR ); close( clientSocket ); return NULL; } bytesSent = send( clientSocket, sendBuf, strlen(sendBuf), 0); if ( bytesSent == SOCKET_ERROR ) fprintf ( stderr, "Error Sending Message.\n" ); } shutdown( clientSocket, SHUT_RDWR ); close( clientSocket ); return NULL; } void * recvThread ( void * args ) { int clientSocket; ssize_t bytesRecv = 0; char recvBuf[MAX_LENGTH] = ""; clientSocket = *(int *)args; while ( bytesRecv != SOCKET_ERROR && stop == false ) { bytesRecv = recv (clientSocket, recvBuf, sizeof(recvBuf), 0); if ( bytesRecv == 0 ) { printf ( "Connection Closed.\n" ); stop = true; shutdown( clientSocket, SHUT_RDWR ); close( clientSocket ); return NULL; } if ( bytesRecv < 0 ) { stop = true; shutdown( clientSocket, SHUT_RDWR ); close( clientSocket ); return NULL; } recvBuf[bytesRecv] = '\0'; puts ( recvBuf ); } shutdown( clientSocket, SHUT_RDWR ); close( clientSocket ); return NULL; } int main ( void ) { int serverSocket, clientSocket = SOCKET_ERROR; struct sockaddr_in serverService, clientService; socklen_t addrlen; pthread_t pSendThread, pRecvThread; serverSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if ( serverSocket == INVALID_SOCKET ) { fprintf ( stderr, "Socket Initialization Error.\n" ); return EXIT_FAILURE; } memset( &serverService, 0, sizeof(serverService) ); serverService.sin_family = AF_INET; serverService.sin_addr.s_addr = INADDR_ANY; serverService.sin_port = htons(2007); if ( bind( serverSocket, (struct sockaddr *)&serverService, sizeof(serverService) ) == SOCKET_ERROR ) { fprintf ( stderr, "Bind failed.\n" ); shutdown( serverSocket, SHUT_RDWR ); close( serverSocket ); return EXIT_FAILURE; } if ( listen( serverSocket, 1 ) == SOCKET_ERROR ) { fprintf ( stderr, "Listen failed.\n" ); shutdown( serverSocket, SHUT_RDWR ); close( serverSocket ); return EXIT_FAILURE; } printf ( "Waiting for a client to connect...\n" ); clientSocket = SOCKET_ERROR; addrlen = sizeof(clientService); while ( clientSocket == SOCKET_ERROR ) { clientSocket = accept ( serverSocket, (struct sockaddr *)&clientService, &addrlen ); } printf ( "%s:%d connected.\n", inet_ntoa(clientService.sin_addr), ntohs(clientService.sin_port) ); if ( pthread_create( &pSendThread, NULL, sendThread, &clientSocket ) ) { fprintf ( stderr, "Message sending thread Creation Failed.\n" ); } if ( pthread_create( &pRecvThread, NULL, recvThread, &clientSocket ) ) { fprintf ( stderr, "Message receiving thread Creation Failed.\n" ); } pthread_join( pSendThread, NULL ); pthread_join( pRecvThread, NULL ); shutdown( clientSocket, SHUT_RDWR ); close( clientSocket ); shutdown( serverSocket, SHUT_RDWR ); close( serverSocket ); return EXIT_SUCCESS; }