Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #C server client select()
- https://github.com/shfx17
- // server
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <string.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <signal.h>
- #define MAXLINE 100
- #define MAX 2
- char buff[MAXLINE];
- char recvline[MAXLINE+1];
- void main(void) {
- struct sockaddr_in servaddr, clientaddr; fd_set rset, allset;
- socklen_t size = 8;
- int maxi = -1, maxfd, sockfd, connfd, nready, clients[MAX], i,n;
- sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) {
- printf("Nie utworzono socketu!\n"); exit(0);
- } else {
- printf("*** Witamy w programie SERWERA! Utworzono socket! ***\n"); maxfd = sockfd;
- }
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_port = htons(8070);
- if (bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) != 0) {
- printf("Nie powiązano socketu!\n");
- exit(0);
- } else {
- printf("Powiązano socket pomyślnie!\n");
- }
- if(listen(sockfd, 5) != 0) {
- printf("Błąd nasłuchiwania zgłoszeń od klienta!\n"); exit(0);
- } else {
- printf("Nasłuchuje żądań klienta...\n"); for (i = 0; i < MAX; i++) {
- clients[i] = -1;
- }
- FD_ZERO(&allset); FD_SET(sockfd, &allset);
- }
- for( ; ;) {
- rset = allset;
- nready = select(maxfd + 1, &rset, NULL, NULL, NULL); if (FD_ISSET(sockfd, &rset)) {
- connfd = accept(sockfd, (struct sockaddr *)&clientaddr, &size); if(connfd < 0) {
- printf("Nie zaakceptowano żądania klienta!\n"); exit(0);
- } else {
- for (i = 0; i < MAX; i++) { if (clients[i] < 0) {
- clients[i] = connfd;
- printf("Zaakceptowano żądanie klienta numer: %d!\n", i+1);
- printf("Pozostało wolnych miejsc: %d!\n", MAX-(i+1)); sleep(1);
- break;
- }
- }
- }
- if (i == MAX) {
- printf("MAKSYMALNA ILOŚĆ KLIENTÓW TO %d!\n", MAX);
- }
- FD_SET(connfd, &allset);
- if (connfd > maxfd) maxfd = connfd; if (i > maxi) maxi = i;
- if (nready-- <= 0) continue;
- }
- // calculate_and_send(clients, &rset, &allset, maxi);
- int k;
- for(k = 0; k<=maxi ; k++){
- if(clients[k]<0) continue;
- if(FD_ISSET(clients[k],&rset)){
- while ( (n = read(connfd, recvline, MAXLINE)) > 0) {
- recvline[n] = 0;
- if (fputs(recvline, stdout) == EOF) puts("Wystapil blad");
- memset(buff, 0, sizeof(buff));
- int i, j;
- for(i = strlen(recvline) - 1, j = 0; i >= 0; i--, j++) {
- buff[j] = recvline[i];
- }
- buff[n] = 0;
- printf("Wysylam odpowiedz: %s\n", buff);
- write(connfd, buff, strlen(buff));
- }
- }
- }
- }
- if(close(sockfd) == -1) {
- printf("Błąd zamknięcia socketu!\n"); exit(0);
- } else {
- printf("Zamknięto socket!\n");
- }
- }
- //client
- #include <netinet/in.h>
- #include <string.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <arpa/inet.h>
- #include <sys/ioctl.h>
- #include <signal.h>
- #define MAXLINE 100
- #include <stdio.h>
- #include <stdlib.h>
- struct sockaddr_in servaddr;
- int sockfd, maxclifd;
- fd_set rset, allset;
- char recvline[MAXLINE+1];
- char buff[MAXLINE];
- void wyslij (int sockfd, const char*c)
- {
- if(write(sockfd, c, strlen(c))<=0)
- puts("write error");
- printf("Wyslano dane do serwera: %s\n", c);
- }
- int sockfd, n,connfd;
- int main(){
- sockfd = socket(AF_INET, SOCK_STREAM, 0);
- if(sockfd < 0)
- puts("Blad socket");
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_port = htons(8070);
- if(inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr)<0){
- puts("Blad inet_ption");
- }
- maxclifd = sockfd;
- FD_ZERO(&allset);
- FD_SET(sockfd, &allset);
- rset = allset;
- select(maxclifd + 1, NULL, &rset, NULL, NULL);
- if(FD_ISSET(sockfd, &rset)){
- if(connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0)
- puts("Blad connect");
- printf("Podaj ciag znakow\n");
- if (fgets(buff, sizeof(buff), stdin) != NULL) {
- printf("Wysylanie %s\n", buff);
- write(sockfd, buff, strlen(buff));
- } else printf("Blad wczytywania!\n");
- n = read(sockfd, recvline, MAXLINE);
- recvline[n]=0;
- if(fputs(recvline,stdout) == EOF)
- puts("Problem fputs error");
- if(n<0)
- puts("read error");
- if(close(sockfd)<0)
- puts("close error");
- n = read(sockfd, recvline, MAXLINE);
- recvline[n] = 0;
- printf("Otrzymalem: ");
- if (fputs(recvline, stdout) == EOF) puts("Blad odczytu z serwera");
- printf("\n");
- close(sockfd);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement