/*next*/ Allgmeines Kommunikationsbeispiel mit Threads ============================================= Headerfile fuer Server und Client: ---------------------------------- /* inet.h */ #include #include #include #include #define SERV_TCP_PORT 8002 #define SERV_HOST_ADDR "141.20.20.139" #define MAXLINE 512 Client-Programm mit Sockets: ---------------------------- /* c_sock.c - client for tcp-socket */ #include "inet.h" #include #include #include pthread_t threadread, threadwrite; /* read from 0, write to socket */ void *talkread(sockfd) int *sockfd; { int n; char sendline[MAXLINE]; while (write(1,"c: ",3),(n=read(0,sendline, MAXLINE)) > 0) { if (write(*sockfd,sendline,n) != n) break; } pthread_cancel(threadwrite); } /*next*/ /* read from socket, write to 1 */ void *talkwrite(sockfd) int *sockfd; { int n; char sendline[MAXLINE]; while (1) { if ((n=read(*sockfd,sendline,MAXLINE)) <= 0) break; write(1,"\n",1); write(1,sendline,n); write(1,"C: ",3); } pthread_cancel(threadread); } main(argc,argv) int argc; char *argv[]; { int sockfd; struct sockaddr_in serv_addr; pthread_t thread1, thread2; bzero((char *)&serv_addr,sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(SERV_TCP_PORT); serv_addr.sin_addr.s_addr = inet_addr(SERV_HOST_ADDR); if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){ fprintf(stderr, "c_sock: can't open stream socket\n"); exit(-1); } /*next*/ if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { fprintf(stderr, "c_sock: can't connect to server\n"); exit(-2); } pthread_create(&threadread, NULL, (void *) talkread, (void *) &sockfd); pthread_create(&threadwrite, NULL, (void *) talkwrite, (void *) &sockfd); pthread_join(threadread, NULL); write(1,"main read\n",10); pthread_join(threadwrite, NULL); write(1,"\nconnection down\n",17); exit(0); } /*next*/ Server-Programm (1.Variante): ----------------------------- /* s_sock1.c - Server for tcp-socket */ #include "inet.h" #include #include #include pthread_t threadread, threadwrite; /* read from 0 and write to socket */ void *talkread(sockfd) int *sockfd; { int n; char sendline[MAXLINE]; while (write(1,"s: ",3),(n=read(0,sendline, MAXLINE)) > 0) { if (write(*sockfd,sendline,n)!=n)break; } pthread_cancel(threadwrite); n=0; pthread_exit(&n); } /* write to 1 and read from socket */ void *talkwrite(sockfd) int *sockfd; { int n; char sendline[MAXLINE]; while (1) { if ((n=read(*sockfd,sendline,MAXLINE)) <= 0) break; write(1,"\n",1); write(1,sendline,n); write(1,"S: ",3); } pthread_cancel(threadread); n=0; pthread_exit(&n); } /*next*/ main(argc,argv) int argc; char *argv[]; { int sockfd, newsockfd, clilen, childpid; struct sockaddr_in cli_addr, serv_addr; int i; if ((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){ fprintf(stderr, "server: can't open stream socket\n"); exit(-1); } bzero((char *)&serv_addr,sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* or your own address */ serv_addr.sin_port = htons(SERV_TCP_PORT); if ((i=bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr))) < 0){ fprintf(stderr, "server: can't bind local address: %d\n",i); exit(-2); } listen(sockfd,5); for (;;) { clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0){ fprintf(stderr,"server: accept error\n"); exit(-3); } pthread_create(&threadread, NULL, (void *) talkread, (void *) &newsockfd); pthread_create(&threadwrite, NULL, (void *) talkwrite, (void *) &newsockfd); pthread_join(threadread, NULL); pthread_join(threadwrite, NULL); write(1,"\nconnection down\n",17); close(newsockfd); } } /*next*/ Server-Programm (2.Variante): ----------------------------- /* s_sock2.c - Server for tcp-socket */ #include "inet.h" #include #include #include pthread_t threadread, threadwrite, threadwait; /* wait for child */ void *waitchild(pid) int *pid; { wait(NULL); } /* read from 0 and write to socket */ void *talkread(sockfd) int *sockfd; { int n; char sendline[MAXLINE]; while (write(1,"s: ",3),(n=read(0,sendline, MAXLINE)) > 0) { if (write(*sockfd,sendline,n) !=n) break; } pthread_cancel(threadwrite); } /*next*/ /* write to 1 and read from socket */ void *talkwrite(sockfd) int *sockfd; { int n; char sendline[MAXLINE]; while (1) { if ((n=read(*sockfd,sendline, MAXLINE)) <= 0) break; write(1,"\n",1); write(1,sendline,n); write(1,"S: ",3); } pthread_cancel(threadread); } main(argc,argv) int argc; char *argv[]; { int sockfd, newsockfd, clilen, childpid; struct sockaddr_in cli_addr, serv_addr; int i; if ((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){ fprintf(stderr, "server: can't open stream socket\n"); exit(-1); } bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* or your own address */ serv_addr.sin_port = htons(SERV_TCP_PORT); if ((i=bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr))) < 0){ fprintf(stderr, "server: can't bind local address: %d\n",i); exit(-2); } /*next*/ listen(sockfd,5); for (;;) { clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen); if (newsockfd < 0){ fprintf(stderr,"server: accept error\n"); exit(-3); } if ((childpid = fork()) < 0) { fprintf(stderr,"server: fork error\n"); exit(-4); } else if (childpid == 0) { close(sockfd); pthread_create(&threadread, #ifdef DEC pthread_attr_default, #else NULL, #endif (void *) talkread, (void *) &newsockfd); pthread_create(&threadwrite, #ifdef DEC pthread_attr_default, #else NULL, #endif (void *) talkwrite, (void *) &newsockfd); pthread_join(threadread, NULL); pthread_join(threadwrite, NULL); write(1,"\nconnection down\n",17); exit(0); } close(newsockfd); pthread_create(&threadwait, #ifdef DEC pthread_attr_default, #else NULL, #endif (void *) waitchild, (void *) &childpid); } }