Extras din proiect
//*************************sercer.c*********************************
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SERVER_BANNER "Introduceti un numar si voi spune daca este par sau impar !"
#define MAX_CLIENTS 5
//Primeste un mesaj de eroare si il printeaza
void error(char *msg)
{
perror(msg);
exit(1);
}
int main(int argc, char *argv[])
{
int sockfd, newsockfd, portno, clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n, i, j;
fd_set read_fds; //fd_set folosit in select()
fd_set tmp_fds; //fd_set folosit temporar
int fdmax; //nr maxim de file descriptori
if (argc < 2) {
fprintf(stderr,"Usage : %s portn", argv[0]);
exit(1);
}
//golim read_fds
FD_ZERO(&read_fds);
FD_ZERO(&tmp_fds);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
portno = atoi(argv[1]);
memset((char *) &serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY; // foloseste adresa IP a masinii
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(struct sockaddr)) < 0)
error("ERROR on binding");
listen(sockfd, MAX_CLIENTS);
//adaugam noul file descriptor in multimea read_fds
FD_SET(sockfd, &read_fds);
fdmax = sockfd;
// main loop
for(;;) {
tmp_fds = read_fds;
if (select(fdmax + 1, &tmp_fds, NULL, NULL, NULL) == -1)
error("ERROR in select");
for(i = 0; i <= fdmax; i++) {
if (FD_ISSET(i, &tmp_fds)) {
if (i == sockfd) {
// o noua conexiune
clilen = sizeof(cli_addr);
if ((newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen)) == -1) {
error("ERROR in accept");
} else {
FD_SET(newsockfd, &read_fds);
if (newsockfd > fdmax) {
fdmax = newsockfd;
}
printf("selectserver: new connection from %sn ", inet_ntoa(cli_addr.sin_addr));
//trimitem banner
n = send(newsockfd, SERVER_BANNER, strlen(SERVER_BANNER), 0);
if (n < 0)
error("ERROR writing to socket");
}
} else {
// am primit date
Preview document
Conținut arhivă zip
- Socket - Client-Server.doc