Here is the full code.
CLIENT:
Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <errno.h>
int main(int argc, char *argv[]) {
int sockfd, portno, readfd, writefd, yes = 1;
char buffer[1024];
struct hostent *server;
struct sockaddr_in serv_addr/*, cli_addr*/;
if(argc < 3)
{
fprintf(stderr, "Ussage: %s IP Address port #", argv[0]);
exit(EXIT_FAILURE);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
fprintf(stderr, "SOCKET(-1) ---> %s.", strerror(errno));
exit(EXIT_FAILURE);
}
if(sockfd == 0)
{
fprintf(stderr, "SOCKET(0) ---> %s.", strerror(errno));
exit(EXIT_FAILURE);
}
int x = fcntl(sockfd, F_SETFL, O_NONBLOCK);
if (x < 0)
{
printf("FCNTL(-1) ---> %s.\n", strerror(errno));
/*close(sockfd);
exit(EXIT_FAILURE);*/
}
if(x == 0)
{
printf("FCNTL(0) ---> %s.\n", strerror(errno));
}
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
bzero((char *) &serv_addr, sizeof(serv_addr));
server = gethostbyname(argv[1]);
if(server == NULL)
{
fprintf(stderr, "No such host.");
printf("SERVER(NULL) ---> %s", strerror(errno));
exit(EXIT_FAILURE);
}
portno = atoi(argv[2]);
serv_addr.sin_family = AF_INET;
memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
serv_addr.sin_port = htons(portno);
int connector = connect(sockfd, (const struct sockaddr *) &serv_addr, sizeof(serv_addr));
if((connector < 0) && (!EINPROGRESS))
{
fprintf(stderr, "CONNECT(-1) ---> %s.\n", strerror(errno));
exit(EXIT_FAILURE);
}
else
{
fprintf(stdout, "Made a connection to %s\n", inet_ntoa(serv_addr.sin_addr));
}
for( ; ; ) {
int i = sizeof(buffer)-1; if(i > 0) bzero(buffer, sizeof(buffer));
fprintf(stdout, "Message: ");
fgets(buffer, sizeof(buffer), stdin);
writefd = write(sockfd, buffer, strlen(buffer)-1);
if(writefd > 0)
{
printf("Waiting for %s\n", inet_ntoa(serv_addr.sin_addr));
}
else
{
if(writefd < 0)
{
fprintf(stderr, "WRITE(c) ---> %s.\n", strerror(errno));
printf("errno = %d.\n", errno);
exit(EXIT_FAILURE);
}
if(writefd == 0)
{
printf("WRITE(0). ---> %s.\n", strerror(errno));
exit(EXIT_FAILURE);
}
}
//i = sizeof(buffer); if(i > 0) bzero(buffer, sizeof(buffer)-1);
if((readfd <= 0) && (readfd == EAGAIN))
{
readfd = read(sockfd, buffer, sizeof(buffer));
/*if(readfd < 0)
{
fprintf(stderr, "Error reading message from %s\n", inet_ntoa(cli_addr.sin_addr));
printf("READ(-1) ---> %s.\n", strerror(errno));
exit(EXIT_FAILURE);
}
//Test to see if the buffer is blank. Uncomment to test.
if(readfd == 0)
{
printf("READ(0) ---> %s. Null buffer.\n", strerror(errno));
exit(EXIT_FAILURE);
}*/
//else if((readfd == EAGAIN) && (readfd != EAGAIN))
//{
//fprintf(stdout, "%s", buffer);
//}
}
else
{
fprintf(stdout, "%s", buffer);
}
}
close(sockfd);
return 0;
}
SELECT SERVER:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <netdb.h>
int main(int argc, char *argv[]) {
/* master file descriptor list */
fd_set master;
/* temp file descriptor list for select() */
fd_set read_fds;
/* server & client address */
struct sockaddr_in serv_addr, cli_addr;
struct timeval timeout;
/* maximum file descriptor number */
int fdmax;
/* listening socket descriptor */
int sockfd;
/* newly accept()ed socket descriptor */
int newsockfd;
/* buffer for client data */
char buf[1024];
int nbytes;
/* for setsockopt() SO_REUSEADDR, below */
int yes = 1;
socklen_t clilen;
int i, j;
/* clear the master and temp sets */
FD_ZERO(&master);
FD_ZERO(&read_fds);
if(argc < 2)
{
printf("USAGE: %s + <portno>\n", argv[0]);
exit(EXIT_FAILURE);
}
timeout.tv_sec = 300;
timeout.tv_usec = 0;
/* get the listener */
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
printf("%s. SOCKET()", strerror(errno));
exit(EXIT_FAILURE);
}
else if(sockfd)
{
do
{
{
printf("Waiting for a connection.\n");
}
} while(!accept);
}
printf("Server-socket() is OK...\n");
/*"address already in use" error message */
if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) < 0)
{
printf("SETSOCKOPT() ---> %s.\n", strerror(errno));
exit(EXIT_FAILURE);
}
printf("Server-setsockopt() is OK...\n");
/* bind */
int portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(portno);
memset(&(serv_addr.sin_zero), '\0', 8);
int binder;
binder = bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
if(binder == -1)
{
printf("BIND() ---> %s.\n", strerror(errno));
exit(EXIT_FAILURE);
}
printf("Server-bind() is OK...\n");
/* listen */
int listener = listen(sockfd, 10);
if(listener < 0)
{
printf("LISTEN() ---> %s.\n", strerror(errno));
exit(EXIT_FAILURE);
}
printf("Server-listen() is OK...\n");
/* add the listener to the master set */
FD_SET(sockfd, &master);
/* keep track of the biggest file descriptor */
fdmax = sockfd; /* so far, it's this one*/
/* Main loop */
for( ; ; )
{
/* copy it */
read_fds = master;
int selector = select(fdmax+1, &read_fds, NULL, NULL, &timeout);
if(selector < 0)
{
printf("SELECT(-1) ---> %s.\n", strerror(errno));
exit(EXIT_FAILURE);
}
if(selector == 0)
{
printf("SELECT(0) ---> %s.\n", strerror(errno));
exit(EXIT_FAILURE);
}
else
{
printf("Server-select() is OK...\n");
printf("Waiting for data...\n");
}
/*run through the existing connections looking for data to be read*/
for(i = 0; i <= fdmax; i++)
{//2nd for loop
if(FD_ISSET(i, &read_fds))
{ /* we got one... */
if(i == sockfd)
{
/* handle new connections */
clilen = sizeof(cli_addr);
if((newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen)) == -1)
{
printf("ACCEPT() ---> %s.\n", strerror(errno));
exit(EXIT_FAILURE);
}
else
{
printf("Server-accept() is OK...\n");
FD_SET(newsockfd, &master); /* add to master set */
if(newsockfd > fdmax)
{
/* keep track of the maximum */
fdmax = newsockfd;
}
printf("%s: New connection from %s on socket %d\n", argv[0], inet_ntoa(cli_addr.sin_addr), newsockfd);
}
}
else
{
/* handle data from a client */
if((nbytes = recv(i, buf, sizeof(buf), 0)) <= 0)
{
/* got error or connection closed by client */
if(nbytes == 0)
/* connection closed */
printf("%s: socket %d hung up\n", argv[0], i);
else
printf("RECV() ---> %s.\n", strerror(errno));
/* close it... */
close(i);
/* remove from master set */
FD_CLR(i, &master);
}
else
{
/* we got some data from a client*/
for(j = 0; j <= fdmax; j++)
{//3rd for loop
/* send to everyone! */
if(FD_ISSET(j, &master))
{
/* except the listener and ourselves */
if(j != sockfd && j != i)
{
if(send(j, buf, nbytes, 0) == -1)
{
printf("SEND() ---> %s.\n", strerror(errno));
exit(EXIT_FAILURE);
}
}
}
}//3rd for loop
}
}
}
}//2nd for loop
}//Main loop
return 0;
}
In the meantime i will re-read up on the read function(Non-blocking). Also could you explain more about how i am using read in a bogus way?