All pastes #286728 Raw Edit

Glasswalker

public cpp v1 · immutable
#286728 ·published 2006-12-20 21:51 UTC
rendered paste body
#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>#define MYPORT 12040#define BACKLOG 10#define BUFFER_SIZE 256using namespace std;int tcpip_bindsocket(char s_address[16], int s_port);void tcpip_listen(int socketfd, int backlog);int tcpip_accept(int socketfd);void tcpip_close(int socketfd);void server_mainlistener(int socketfd);void server_mainclienthandler(int socketfd);int tcpip_bindsocket(char s_address[16], int s_port){    int sockfd;    int yes=1;    struct sockaddr_in my_addr;    if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)    {        perror("TCPIP Error: Failed to create socket");        exit(1);    }    if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1)    {        perror("TCPIP Error: setsockopt failed");        exit(1);    }    my_addr.sin_family = AF_INET;    my_addr.sin_addr.s_addr = inet_addr(s_address);    my_addr.sin_port = htons(s_port);    memset(&(my_addr.sin_zero), '\0', 8);    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)    {        perror("TCPIP Error: Can't bind to port");        exit(1);    }    return sockfd;}void tcpip_listen(int socketfd, int backlog){    if (listen(socketfd, backlog) == -1)    {        perror("TCPIP Error: Listen Failed");        exit(1);    }}int tcpip_accept(int socketfd){    socklen_t sin_size;    int new_fd;    struct sockaddr_in their_addr; // connector's address information    new_fd = accept(socketfd, (struct sockaddr *)&their_addr, &sin_size);    return new_fd;}void tcpip_close(int socketfd){    close(socketfd);}void server_mainclienthandler(int socketfd){    send(socketfd, "Hello, world!\n", 14, 0);}void server_mainlistener(int socketfd){    socklen_t sin_size;    int client_sockfd;    struct sockaddr_in remoteaddr; // connector's address information    fd_set master;   // master file descriptor list    fd_set read_fds; // temp file descriptor list for select()    int fdmax;        // maximum file descriptor number    char buf[BUFFER_SIZE];    // buffer for client data    int nbytes;    socklen_t addrlen;    int i, j;    FD_ZERO(&master);    // clear the master and temp sets    FD_ZERO(&read_fds);    FD_SET(socketfd, &master);    fdmax = socketfd;        while(1)    {        read_fds = master;        if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1)         {            perror("TCPIP Error: Select Failed");            exit(1);        }        for(i = 0; i <= fdmax; i++)         {            if (FD_ISSET(i, &read_fds))             {                if (i == socketfd)                 {                    // handle new connections                    addrlen = sizeof(remoteaddr);                    if(client_sockfd = tcpip_accept(socketfd) == -1)                     {                         perror("TCPIP Error: Accept Failed");                    } else {                        FD_SET(client_sockfd, &master); // add to master set                        if (client_sockfd > fdmax)                         {                             fdmax = client_sockfd;                        }                        printf("TCPIP: New connection from %s on: socket %d\n", inet_ntoa(remoteaddr.sin_addr), client_sockfd);                    }                } 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("TCPIP: Socket %d disconnected\n", i);                        } else {                            perror("TCPIP Error: Recieve error");                        }                        close(i); // bye!                        FD_CLR(i, &master); // remove from master set                    } else {                        // client still connected			server_mainclienthandler(i);                    }                }            }	}    }}main(){    int sockfd, new_fd;  // listen on sock_fd, new connection on new_fd    sockfd = tcpip_bindsocket("192.168.0.8",MYPORT); // open the socket    tcpip_listen(sockfd,BACKLOG); // start listening    server_mainlistener(sockfd); // run the main listener loop    exit(1);}