/* A simple server in the internet domain using TCP The port number is passed as an argument */ #include #include #include #include #include #include #include #include "../common/fbgui.h" void error(const char *msg) { perror(msg); exit(1); } int main(int argc, char *argv[]) { int sockfd, newsockfd; socklen_t clilen; char buffer[DHCP_MESSAGE_SIZE]; const char ack[ACK_SIZE] = "ACK"; struct sockaddr_un serv_addr, cli_addr; int n; sockfd = socket(AF_UNIX, SOCK_STREAM, 0); if (sockfd < 0) error("ERROR opening socket"); bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sun_family = AF_UNIX; strcpy(serv_addr.sun_path, "/var/tmp/qt_c_socket_default"); unlink("/var/tmp/qt_c_socket_default"); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("ERROR on binding"); if (listen(sockfd, 5) == -1) { error("ERROR on listen"); } for (;;) { int done; printf("Waiting for a connection...\n"); clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) error("ERROR on accept"); printf("Connected.\n"); done = 0; do { bzero(buffer, DHCP_MESSAGE_SIZE); n = read(newsockfd, buffer, DHCP_MESSAGE_SIZE); if (n <= 0) { if (n<0) error("ERROR reading from socket"); done = 1; } // search for last newline and replace it with a null char * pch; pch=strrchr(buffer,'\n'); buffer[pch-buffer] = '\0'; printf("Here is the message: \"%s\"\n", buffer); if(!done) { printf("send ACK\n"); if (send(newsockfd, ack, ACK_SIZE, 0) < 0) { error("ERROR on send"); done = 1; } } } while (!done); close(newsockfd); } close(sockfd); return 0; }