All pastes #1505903 Raw Edit

Socket Server

public c v1 · immutable
#1505903 ·published 2009-07-24 16:50 UTC
rendered paste body
// i didn't make this,a guy named sys did, i just thought it would be useful..#include <arpa/inet.h>#include <fcntl.h>#include <netinet/in.h>#include <stdio.h>#include <string.h>#include <sys/ioctl.h>#include <sys/param.h>#include <sys/socket.h>#include <sys/types.h>#include <unistd.h>#define BACKLOG 3#define BUFFSIZE 512#define MAXCONN 1024#define PORT 43594struct client{  struct client * next;  struct sockaddr_in client;  unsigned int sockfd;  char * ip;  char in[512];  char out[512];  int isActive;  int id;};struct server{  int isActive;};struct client clients[MAXCONN];int getFreeId(void){  int i;  for (i = 0; i < MAXCONN; i++)  {    if (!clients[i].sockfd)    {      return i;    }  }  return -1;}int main(int argc, char * argv[]){  unsigned int sockfd;  sockfd = socket(AF_INET, SOCK_STREAM, 0);  if (sockfd < 0)  {    fprintf(stderr, "Error creating file descriptor.\r\n");  }  else  {    fprintf(stdout, "File descriptor created.\r\n");  }  struct sockaddr_in server;  memset(&server, 0, sizeof server);  server.sin_family = AF_INET;  server.sin_port = htons(PORT);  server.sin_addr.s_addr = htonl(INADDR_ANY);  int eid;  eid = bind(sockfd, (struct sockaddr *) &server, sizeof server);  if (eid < 0)  {    fprintf(stderr, "Error binding socket to local port.\r\n");  }  else  {    fprintf(stdout, "Bound to port %d\r\n", PORT);  }  int flags = 1;  //eid = ioctl(sockfd, FIOBIO, &flags);  eid = fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);  if (eid < 0)  {    fprintf(stderr, "Error setting nonblock option.\r\n");  }  else  {    fprintf(stdout, "Nonblocking.\r\n");  }  eid = listen(sockfd, BACKLOG);  if (eid < 0)  {    fprintf(stderr, "Error while listening.\r\n");  }  else  {    fprintf(stdout, "Listening for connections on port %d\r\n", PORT);  }  int fd = 0;  while (1)  {    char buffer[512];    if (!clients[fd].sockfd)    {      //fprintf(stderr, "No such descriptor %d.\r\n", fd);    }    else     {      eid = recv(clients[fd].sockfd, clients[fd].in, sizeof clients[fd].in, 0);    }    if (eid <= 0)    {      //fprintf(stderr, "Error reading from %d.\r\n", fd);    }    else    {      fprintf(stdout, "%s\r\n", clients[fd].in);    }    struct sockaddr_in client;    unsigned int len;    len = sizeof client;    eid = accept(sockfd, (struct sockaddr *) &client, &len);    if (eid < 0)    {      //fprintf(stderr, "Error accepting connection.\r\n");    }    else    {      int id;      id = getFreeId();      if (id < 0)      {        fprintf(stderr, "Unable to accept connection, maximum clients of %d reached.\r\n", MAXCONN);        sprintf(buffer, "Unable to accept connection, maximum clients of %d reached.\r\n", MAXCONN);        send(eid, buffer, strlen(buffer), 0);        close(eid);      }      else       {        clients[id].sockfd = eid;        struct sockaddr_in addr;        len = sizeof addr;        eid = getpeername(eid, (struct sockaddr *) &addr, &len);        if (eid < 0)        {          fprintf(stderr, "Error obtaining remote address.\r\n");        }        else        {          clients[id].ip = inet_ntoa(client.sin_addr);          fprintf(stdout, "Connection accepted from %s.\r\n", clients[id].ip);        }        //close(eid);      }    }    fd = (fd + 1) % MAXCONN;  }  return 0;}