/* File: test_socket_server.c */ #include #include #include #include #include #include #include #include #include #include #include #include #include "defs.inc" #ifdef USE_SOCK_STREAM #define type SOCK_STREAM #else #define type SOCK_DGRAM #endif /* FIXME: Support AF_INET */ #ifdef USE_AF_UNIX #define domain AF_UNIX #else #define domain AF_INET #endif #define SOCKET_NAME "test_socket" int socket_unix (const char* socket_name) { int err = 0, socket_fd; #ifdef USE_AF_UNIX struct sockaddr_un server; #else struct sockaddr_in server; #endif /* Create socket */ socket_fd = socket (domain, type, 0); if (socket_fd == -1) { perror("test_socket_server:socket_unix(): socket()"); return -1; } printf ("test_socket_server:socket_unix(): socket() socket_fd = %d\n", socket_fd); #ifdef USE_AF_UNIX server.sun_family = domain; strncpy (server.sun_path, socket_name, sizeof(server.sun_path)); #else server.sin_family = domain; server.sin_addr.s_addr = inet_addr("127.0.0.1"); server.sin_port = htons( 8888 ); #endif /* Bind a name to socket_fd */ err = bind (socket_fd, (struct sockaddr*) &server, sizeof(server)); if (err == -1) { perror ("test_socket_server:socket_unix(): bind()"); return -1; } #ifdef USE_SOCK_STREAM /* Listen on socket_fd */ err = listen (socket_fd, 5); if (err == -1) { perror ("test_socket_server:socket_unix(): listen()"); return -1; } printf ("test_socket_server:socket_unix(): listen() Listening on socket_fd = '%d'\n", socket_fd); #endif return socket_fd; } #define BUF_LEN 1024 int read_socket (int socket_fd) { char buf[BUF_LEN]; int read_size, err = 0;; printf( "test_socket_server:read_socket(): Waiting for incoming connections...\n"); #ifdef USE_SOCK_STREAM struct sockaddr_in client; int c = sizeof (struct sockaddr_in); int client_sock; /* Accept connection from an incoming client */ client_sock = accept (socket_fd, (struct sockaddr *)&client, (socklen_t*)&c); if (client_sock == -1) { perror ("test_socket_server:read_socket(): accept()"); return -1; } #endif /* Receive a message from client */ #if 1 do { bzero(buf, sizeof(buf)); #ifdef USE_SOCK_STREAM if ((read_size = read (client_sock, buf, BUF_LEN)) < 0) #else if ((read_size = read (socket_fd, buf, BUF_LEN)) < 0) #endif perror("test_socket_server:read_socket(): read() reading stream message"); else if (read_size == 0) printf("test_socket_server:read_socket(): read() Ending connection\n"); else printf("test_socket_server:read_socket(): read() Message = '%s'\n", buf); } while (read_size > 0); #else #ifdef USE_SOCK_STREAM while ((read_size = recv (client_sock, buf, BUF_LEN, 0)) > 0) #else while ((read_size = recv (socket_fd, buf, BUF_LEN, 0)) > 0) #endif { //Send the message back to client //write (client_sock , buf , strlen(buf)); printf ("test_socket_server:read_socket(): recv() client_message = '%s'\n", buf); } if (read_size == 0) { printf ("test_socket_server:read_socket(): recv() Client disconnected\n"); fflush (stdout); } else if(read_size == -1) perror ("test_socket_server:read_socket(): recv()"); #endif return err; } int file_exist (const char *filename) { struct stat buffer; return (stat (filename, &buffer) == 0); } int main(void) { const char* socket_name = SOCKET_NAME; int socket_fd; int err = 0; printf ("test_socket_server:main(): Domain = %s, Type = %s\n", (domain == AF_UNIX) ? "AF_UNIX": "AF_INET", (type == SOCK_STREAM) ? "SOCK_STREAM": "SOCK_DGRAM"); if (file_exist (socket_name)) { printf ("test_socket_server:main(): Removing old socket: '%s'\n", socket_name); unlink (socket_name); } socket_fd = socket_unix(socket_name); if (socket_fd == -1) { perror ("test_socket_server: unable to create socket"); return -1; } err = read_socket(socket_fd); if (err) { /* Redundant */ //printf ("test_socket_client:main(): read_socket() err = '%s'\n", strerror(errno)); #ifdef USE_SOCK_STREAM perror ("test_socket_client:main(): read_socket() SOCK_STREAM"); #else perror ("test_socket_client:main(): read_socket() SOCK_DGRAM"); #endif } //close(socket_fd); if (file_exist (socket_name)) unlink (socket_name); return err; }