Advertisement
Guest User

client

a guest
Nov 21st, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.15 KB | None | 0 0
  1. /*クライアント
  2. コンパイル時はこんな感じで gcc -O2 -o tcp_newclient tcp_newclient.c
  3. サーバー側も同様
  4.  
  5. */
  6.  
  7. #include "inet.h"                /* サーバと同じ inet.h を共用 */
  8. #define BUFSIZE 1024
  9. char name[64];
  10.  
  11. int gotrcv(int fd){
  12.     fd_set fdset;
  13.     struct timeval timeout;
  14.     FD_ZERO(&fdset);
  15.     FD_SET(fd, &fdset);
  16.     timeout.tv_sec = 0;
  17.     timeout.tv_usec = 0;
  18.     return select(fd+1 , &fdset , NULL , NULL , &timeout );
  19. }
  20. void client(int fd)              /* クライアントの仕事の中心 */
  21. {
  22.   char b[BUFSIZE];
  23.   char c[BUFSIZE];
  24.   int n;
  25.   while(1){
  26.     memset(b, 0, sizeof(b));
  27.     memset(c, 0, sizeof(c));
  28.     if(gotrcv(0)){
  29.       read(0, b, BUFSIZ);
  30.       n = strlen(b);
  31.       b[n - 1] = '\0';
  32.       if ( write(fd, b, n) <= 0 )  /* ヌル文字も含めてサーバに通信 */
  33.         return;
  34.     }
  35.     if(gotrcv(fd)){
  36.       if ( (n = read(fd, c, BUFSIZE)) <= 0 )
  37.        return;
  38.       printf("%s\n", c);
  39.     }
  40.   }
  41. }
  42. void client2(int fd)              /* クライアントの仕事の中心 */
  43. {
  44.   char b[BUFSIZE];
  45.   char c[BUFSIZE];
  46.   int n;
  47.   fd_set readfds;
  48.   while(1){
  49.     memset(b, 0, sizeof(b));
  50.     memset(c, 0, sizeof(c));
  51.     /* readfdsを初期化 */
  52.     FD_ZERO(&readfds);
  53.     /* 標準入力をreadfdsにセットする*/
  54.     FD_SET(0, &readfds);
  55.     /* ソケットをreadfdsにセットする */
  56.     FD_SET(fd, &readfds);
  57.  
  58.     if(FD_ISSET(0, &readfds)){
  59.       read(0, b, BUFSIZ);
  60.       n = strlen(b);
  61.       b[n - 1] = '\0';
  62.       if ( write(fd, b, n) <= 0 )  /* ヌル文字も含めてサーバに通信 */
  63.         return;
  64.     }
  65.     if(FD_ISSET(fd, &readfds)){
  66.       if ( (n = read(fd, c, BUFSIZE)) <= 0 )
  67.        return;
  68.       printf("%s\n", c);
  69.     }
  70.   }
  71. }
  72.  
  73. int input_name(int fd) {
  74.     name[0] = '\0';  /* 初期化 */
  75.     printf("名前を入力してください: ");
  76.     if (fgets(name, sizeof(name), stdin) == NULL) {
  77.         fprintf(stderr, "Input your name!\n");
  78.         close(fd);
  79.         return -1;
  80.     }
  81.     name[strlen(name)-1] = '\0';    /* 改行文字を消す */
  82.     printf("Your name is '%s'\n", name);
  83.     write(fd, name, strlen(name));  /* 送信 */
  84.     return 0;
  85. }
  86.  
  87. void error(char *s)              /* エラー処理 (サーバと同じ) */
  88. {
  89.   perror(s);
  90.   exit(1);
  91. }
  92.  
  93. int main(int argc, char **argv)
  94. {
  95.   int sockfd;
  96.   struct sockaddr_in sin;
  97.  
  98.   if ( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0 ) /* socket */
  99.     error("cannot create socket");
  100.   bzero((char *)&sin, sizeof(sin));          /* sin に 0 をつめる */
  101.   sin.sin_family = PF_INET;                  /* Internet ドメイン */
  102.   sin.sin_addr.s_addr = inet_addr(SERVER_ADDR); /* アドレスはサーバ */
  103.   sin.sin_port = htons(SERVER_PORT);         /* ポートは SERVER_PORT */
  104.   if ( connect(sockfd, (struct sockaddr *)&sin, sizeof(sin)) < 0 )
  105.     error("cannot connect");
  106.   if(input_name(sockfd) < 0)
  107.     error("cannot input");
  108.  
  109.   client(sockfd);                            /* クライアントの仕事の中心 */
  110.   if ( shutdown(sockfd, SHUT_RDWR) < 0 )     /* これ以上の送受信を禁止 */
  111.     error("cannot shutdown");
  112.   close(sockfd);
  113.   return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement