00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <stdio.h>
00021
00022 #ifdef unix
00023 #include <string.h>
00024 #include <errno.h>
00025 #include <stdlib.h>
00026 #include <unistd.h>
00027 #include <sys/types.h>
00028 #include <sys/socket.h>
00029 #include <netdb.h>
00030 #include <netinet/in.h>
00031 #include <arpa/inet.h>
00032 #define closesocket close
00033 #else
00034 #include <winsock2.h>
00035 #endif
00036
00037 #define PORT 5555
00038 #define MAXMSG 512
00039 #define MAXCLI 64
00040
00041
00042 void erro_fatal(char *mensagem) {
00043 perror(mensagem);
00044 exit(EXIT_FAILURE);
00045 }
00046
00047
00048 int cria_soquete_serv(int porta) {
00049 int sock, b;
00050 struct sockaddr_in nome;
00051
00052
00053 sock = socket(PF_INET, SOCK_STREAM, 0);
00054 if (sock < 0)
00055 erro_fatal("socket");
00056
00057
00058 nome.sin_family = AF_INET;
00059 nome.sin_port = htons(porta);
00060 nome.sin_addr.s_addr = htonl(INADDR_ANY);
00061
00062
00063 b = bind(sock, (struct sockaddr *) &nome, sizeof(nome));
00064 if (b < 0)
00065 erro_fatal("bind");
00066
00067
00068
00069 if (listen(sock, 1) < 0)
00070 erro_fatal("socket");
00071 return sock;
00072 }
00073
00074
00075 int envia_pro_cliente(int filedes, char *msg) {
00076 int nbytes;
00077
00078 nbytes = send(filedes, msg, strlen(msg) + 1, 0);
00079 if (nbytes < 0)
00080 erro_fatal("send");
00081 return nbytes;
00082 }
00083
00084
00085
00086
00087
00088
00089
00090
00091 int atende_o_cliente(int sock) {
00092 char buffer[MAXMSG];
00093 char msgg[MAXMSG];
00094 int nbytes;
00095
00096 nbytes = recv(sock, buffer, MAXMSG - 1, 0);
00097 if (nbytes <= 0)
00098 return -1;
00099
00100 printf("Recebi do cliente #%d:\n%s\n", sock, buffer);
00101 sprintf(msgg,"Vc eh o cliente: %d", sock);
00102 envia_pro_cliente(sock,msgg );
00103
00104 return nbytes;
00105 }
00106
00107 int numcli;
00108
00109
00110 int main() {
00111
00112 int sock_ini, fd_sock;
00113 int i, erro;
00114 struct sockaddr_in clientname;
00115 int cli[MAXCLI];
00116
00117 fd_set ativo_fd_set, le_fd_set;
00118 int size;
00119
00120
00121 #ifndef unix
00122 WSADATA wsaData;
00123 if (WSAStartup(MAKEWORD(1, 1), &wsaData)) {
00124 fputs("Erro no WAStartup\n", stderr);
00125 }
00126 #endif
00127
00128
00129 sock_ini = cria_soquete_serv(PORT);
00130
00131 printf("Socket inicial: handle=%d\n", sock_ini);
00132
00133 FD_ZERO(&ativo_fd_set);
00134
00135 FD_SET(sock_ini, &ativo_fd_set);
00136 numcli = 0;
00137 do {
00138
00139 le_fd_set = ativo_fd_set;
00140 erro = select(FD_SETSIZE, &le_fd_set, NULL, NULL, NULL);
00141 if (erro < 0)
00142 erro_fatal("select");
00143
00144
00145 if (FD_ISSET(sock_ini, &le_fd_set)) {
00146 if (numcli >= MAXCLI) {
00147 fputs("Ultrapassou o numero maximo de clientes.", stderr);
00148 continue;
00149 }
00150
00151 size = sizeof(clientname);
00152
00153
00154 fd_sock = accept(sock_ini, (struct sockaddr *) &clientname, &size);
00155
00156 if (fd_sock < 0)
00157 erro_fatal("accept");
00158
00159 printf("Servidor: aceitei conexão do host \"%s\", handle=%d\n",
00160 inet_ntoa(clientname.sin_addr), fd_sock);
00161
00162 FD_SET(fd_sock, &ativo_fd_set);
00163
00164 cli[numcli] = fd_sock;
00165 numcli++;
00166
00167 printf("Agora tem %d clientes\n", numcli);
00168 continue;
00169 }
00170
00171
00172
00173
00174 for (i = 0; i < numcli; i++) {
00175 if (!FD_ISSET(cli[i], &le_fd_set))
00176 continue;
00177
00178 erro = atende_o_cliente(cli[i]);
00179
00180 if (erro < 0) {
00181
00182 closesocket(cli[i]);
00183 FD_CLR(cli[i], &ativo_fd_set);
00184
00185 printf("O cliente #%d saiu; ", cli[i]);
00186 numcli--;
00187
00188 printf("Agora tem %d clientes.\n", numcli);
00189
00190 if (i < numcli)
00191 memmove(cli + i, cli + i + 1, (numcli - i) * sizeof(int));
00192 }
00193 }
00194 } while (1);
00195 return 0;
00196 }
00197