Posted by Anonymous on Wed 10th Oct 11:36 (modification of post by view diff)
download | new post
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdbool.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <string.h>
- #include <unistd.h>
- #include <pthread.h>
- #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 )
- {
- 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;
- }
- clientSocket = SOCKET_ERROR;
- addrlen = sizeof(clientService);
- while ( clientSocket == SOCKET_ERROR )
- {
- clientSocket = accept ( serverSocket, (struct sockaddr *)&clientService, &addrlen );
- }
- 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;
- }
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.