Il Server (Linux) e' una cosa del Genere
codice:#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <sys/select.h> #include <arpa/inet.h> #define PORT 5091 #define BUFFER_SIZE 1024 int main() { fd_set fds, rfds; int s, fd, fdc, fdm; struct sockaddr_in myaddr, remoteaddr; char buf[BUFFER_SIZE]; if ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror("socket()"); exit(-1); }; myaddr.sin_family = AF_INET; myaddr.sin_addr.s_addr = htonl(INADDR_ANY); myaddr.sin_port = htons(PORT); memset(&(myaddr.sin_zero), 0, sizeof(myaddr.sin_zero)); if (bind(s, (struct sockaddr *) &myaddr, sizeof(myaddr)) == -1) { perror("bind()"); exit(-1); } if (listen(s, 5) == -1) { perror("listen()"); exit(-1); } FD_ZERO(&fds); FD_SET(s, &fds); fdm = s; while (1) { rfds = fds; if (select(fdm + 1, &rfds, NULL, NULL, NULL) == -1) { perror("select()"); exit(-1); } for (fd = 0; fd <= fdm; ++fd) { if (FD_ISSET(fd, &rfds)) { if (fd == s) { socklen_t addrlen = sizeof(remoteaddr); if ((fdc = accept(s, (struct sockaddr *) &remoteaddr, &addrlen)) != -1) { if (fdc > fdm) fdm = fdc; printf("connessione da %s, FD %d\n", inet_ntoa(remoteaddr.sin_addr), fdc); FD_SET(fdc, &fds); } else perror("accept()"); } else { int c = recv(fd, buf, sizeof(buf), 0); if ((c > 0) && (*buf != EOF)) { for (fdc = 0; fdc <= fdm; ++fdc) if (FD_ISSET(fdc, &fds) && (fdc != fd) && (fdc != s)) if (send(fdc, buf, c, 0) < 0) perror("send()"); } else { if (c < 0) perror("recv()"); printf("scollegamento di %d\n", fd); close(fd); FD_CLR(fd, &fds); } } } } } return (0); }

Rispondi quotando