Code:
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <glib.h>
#include <pthread.h>
#include <assert.h>
//non standard headers
#include "message.h"
#include "config.h"
int list_s;
int sock;
int conn_s;
struct sockaddr_in servaddr;
ssize_t bytes_encoded, bytes_sent, bytes, lbytes;
char buffer[MAX_BUFFER];
void *message_listener()
{
if((list_s = socket(AF_INET, SOCK_STREAM,0)) < 0)
{
fprintf(stderr, "Error: Can not create listening socket.\n");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(HOST_PORT);
g_print("Starting Listener\n");
if(bind(list_s, (struct sockaddr *) &servaddr, sizeof(servaddr))<0)
{
fprintf(stderr, "Error: Can not bind socket.\n");
exit(EXIT_FAILURE);
}
if (listen(list_s, 5) <0)
{
fprintf(stderr, "Error: Can not call listen()\n");
exit(EXIT_FAILURE);
}
g_print("Listener started\n");
if ((conn_s = accept(list_s, NULL, NULL))<0)
{
fprintf(stderr, "Error: Can not call accept()\n");
exit(EXIT_FAILURE);
}
Message *mess;
mess = alloc_blank_message();
lbytes = read(conn_s, buffer, MAX_BUFFER);
printf("bytes recieved= %d\n", lbytes);
deserialize_message(buffer, mess);
g_print("Message: %s\n", mess->message);
if (close(conn_s)<0);
{
fprintf(stderr, "Error: can not close() on listener\n");
exit(EXIT_FAILURE);
}
free_message(mess);
pthread_exit(NULL);
return NULL;
}
void *sendmessage()
{
Message *mess1;
mess1 = make_message(1);
set_message_string(mess1, "test message");
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) <0)
{
fprintf(stderr, "Error: Can not create socket.\n");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(HOST_PORT);
if(connect(sock, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0)
{
fprintf(stderr, "Error: Can not call connect()\n");
exit(EXIT_FAILURE);
}
bytes_encoded = serialize_message(buffer, mess1);
g_print("Bytes encoded = %d\n", bytes_encoded);
bytes_sent = send(sock, buffer, bytes_encoded, 0);
if(bytes_sent != bytes_encoded)
{
fprintf(stderr, "Error: Can not call send()\n");
exit(EXIT_FAILURE);
}
if( close(sock) < 0 )
{
fprintf(stderr, "Error: Can not call close() on sender\n");
exit(EXIT_FAILURE);
}
free_message(mess1);
pthread_exit(NULL);
}
int main(int argc, char *arg[])
{
pthread_t messageListen_thread;
void *exit_status;
pthread_t sender_thread;
pthread_create(&messageListen_thread, NULL, message_listener, NULL);
g_print("Started Listener Thread\n");
pthread_create(&sender_thread, NULL, sendmessage, NULL);
pthread_join(messageListen_thread, &exit_status);
pthread_join(sender_thread, &exit_status);
return 0;
}
I assumed that to read and send I would need threads, but I am finding that after the structure has been sent, the socket can not close().