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);
}