Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Kod programy Serwer:
- #include <stdlib.h>
- #include <string.h>
- #include <sys/socket.h>
- #include <stdio.h>
- #include <errno.h>
- #include <unistd.h>
- #include <signal.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #include <sys/resource.h>
- #include <sys/wait.h>
- #include <sys/time.h>
- #define MAX 4096
- #define LISTENQ 1024
- #define SIZE 2
- void err_sys(char *s)
- {
- printf("%s\n",s);
- exit (-1);
- }
- union val
- {
- int i_val;
- long l_val;
- char c_val[10];
- struct linger linger_val;
- struct timeval timeval_val;
- } val;
- static char *sock_str_int(union val *, int);
- struct sock_opts
- {
- char *opt_str;
- int opt_level;
- int opt_name;
- char *(*opt_val_str)(union val *,int);
- }
- sock_opts[] = {
- "SO_RCVBUF", SOL_SOCKET, SO_RCVBUF, sock_str_int,
- "SO_SNDBUF", SOL_SOCKET, SO_SNDBUF, sock_str_int,
- };
- static char strres[128];
- static char *
- sock_str_int (union val *ptr, int len)
- {
- if(len != sizeof(int))
- snprintf(strres, sizeof(strres), "size (%d) not sizeof(int)", len);
- else
- snprintf(strres, sizeof(strres), "%d", ptr->i_val);
- return(strres);
- }
- int main(int arg, char **argv)
- {
- int connfd, listenfd, sockfd, i, j=0, liczba[2], wynik=0, tmp=0, maxfd, maxi, nready, client[SIZE];
- int fd,len;
- int a = 6666;
- struct sock_opts *ptr;
- ssize_t n;
- fd_set rset, allset;
- struct sockaddr_in servaddr, cliaddr;
- socklen_t clilen;
- char bufor[MAX], bufortmp[MAX], tmpchar, tabtmp[MAX];
- if((listenfd=socket(AF_INET, SOCK_STREAM, 0))<0)
- err_sys("Błąd otwierania socketa");
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family=AF_INET;
- servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
- servaddr.sin_port = htons(50001);
- if(bind(listenfd,(struct sockaddr *)&servaddr, sizeof(servaddr))<0)
- err_sys("Błąd przybicia gniazda");
- if(listen(listenfd,LISTENQ)<0)
- err_sys("Błąd nasłuchu");
- maxfd = listenfd;
- maxi=-1;
- for(i=0; i<SIZE;i++)
- client[i] = -1;
- FD_ZERO(&allset);
- FD_SET(listenfd, &allset);
- while(1)
- {
- rset = allset;
- puts("Oczekiwanie na klienta, bądź dane");
- nready = select(maxfd+1, &rset, NULL,NULL,NULL);
- if(FD_ISSET(listenfd, &rset))
- {
- clilen = sizeof(cliaddr);
- connfd = accept(listenfd,(struct sockaddr *) &cliaddr, &clilen);
- for(i=0; i<SIZE;i++)
- if(client[i]<0)
- {
- client[i]=connfd;
- break;
- }
- if(i == SIZE)
- err_sys("za duzo klientow");
- FD_SET(connfd,&allset);
- if(connfd>maxfd)
- maxfd=connfd;
- if(i>maxi)
- maxi = i;
- if(--nready <= 0)
- continue;
- }
- for(i=0;i<=maxi;i++)
- {
- if((sockfd=client[i])<0)
- continue;
- if(FD_ISSET(sockfd, &rset))
- {
- if ((n=read(sockfd,bufor,MAX)) < 0)
- {
- perror("Błąd w odczycie");
- exit(-1);
- }
- if(bufor[0] == 'q')
- {
- close(sockfd);
- FD_CLR(sockfd,&allset);
- client[i]=-1;
- }
- else
- {
- puts("Wysłano do klienta");
- --n;
- write(sockfd, &n, sizeof(n));
- if(--nready<=0)
- break;
- } //end else
- } //end if
- } //end for
- fd = socket(AF_INET, SOCK_STREAM, 0);
- for (ptr = sock_opts; ptr->opt_str != NULL; ptr++)
- {
- printf("%s: ", ptr->opt_str);
- if (ptr->opt_val_str ==NULL)
- printf("(undefined)\n");
- else
- {
- len = sizeof(val);
- a = 32222222;
- if (setsockopt(fd, ptr->opt_level, ptr->opt_name, &val, a) == -1)
- {
- fprintf(stderr, "Error setting socket opts: %s\n", strerror(errno));
- close (fd);
- }
- if (getsockopt(fd, ptr->opt_level, ptr->opt_name, &val, &len) == -1)
- {
- err_sys("getsockopt error");
- }
- else
- {
- printf("default = %s\n", (*ptr->opt_val_str)(&val,len));
- }
- }
- }
- } //end for
- } //end main
- Kod programy Klient:
- #include <arpa/inet.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <errno.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <string.h>
- #include <sys/types.h>
- #define MAX_LINE 4096
- int err (char*s)
- {
- printf("%s\n",s);
- printf("Errno:%d\n",errno);
- fprintf(stderr,"%s\n",strerror(errno));
- exit(-1);
- }
- void wyslij (int sockfd,const char *c)
- {
- if (send(sockfd, c, strlen(c),MSG_NOSIGNAL)<=0)
- err("Błąd wysyłki");
- }
- int main(int argc, char *argv[])
- {
- if (argc != 3)
- err("Format: ./klient adres_ip port");
- struct sockaddr_in adres_strukt;
- int sockfd = socket(AF_INET,SOCK_STREAM,0);
- bzero(&adres_strukt,sizeof(adres_strukt));
- adres_strukt.sin_family=AF_INET;
- if (inet_pton(AF_INET,argv[1],&adres_strukt.sin_addr)<0)
- err("Zly format adresu IP");
- if((adres_strukt.sin_port=htons(atoi(argv[2])))<0)
- err("Zly numer portu");
- if (connect(sockfd,(struct sockaddr*)&adres_strukt,sizeof(struct sockaddr_in)) != 0)
- err("Błąd w połączeniu");
- char znaki[MAX_LINE];
- int liczba;
- while(1)
- {
- puts("Wprowadz komunikat");
- fgets(znaki,MAX_LINE,stdin);
- wyslij(sockfd,znaki);
- if (znaki[0] != 'q')
- {
- if (read(sockfd,&liczba,sizeof(int)) == -1)
- err("Błąd w odczycie");
- else
- printf("Liczba znakow: %d\n",liczba);
- }
- else
- {
- puts("Koniec");
- break;
- }
- }
- if (close(sockfd) == -1)
- err("Błąd zamykania");
- return 0;}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement