Linux_C TCPによるチャット機能の実現

24588 ワード

大学2年生の次の学期のLinuxの高級なプログラミングの宿題、比較的に簡単で、本文章はコードだけを提供して、参考に供して、科を掛けるモードは起動します~テーマの要求:
  • は、少なくとも3つのクライアントが同時にチャットルームに入ることができるチャットルームプログラムを実現することを要求する.
  • サーバプログラムにはログ記録機能があり、ログには各クライアントのアクセス時間とIPアドレス
  • が記録される.
    TCPサーバー側コード:
    //serve.c		// 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #define MAXSIZE 128
    
    char news[MAXSIZE];
    int res;							// 
    
    void* pthread_chat(void * arg)		// 
    {
          int confd = *(int *)arg;
          while(1)
          {
              res  = recv(confd, news, sizeof(news), 0);
              if(res <= 0)
              {
    			  perror("recv");
                  break;
              }
              printf("The news is: %s
    "
    ,news); memset(news,0,MAXSIZE); send(confd,"OK",2,0); } printf("One client over
    "
    ); close(confd); } char *Time() // { time_t timer; struct tm *tblock; timer = time(NULL); tblock = localtime(&timer); return asctime(tblock); } void save(char *s) // { int fd; fd = open("journal",O_RDWR|O_APPEND|O_CREAT); if(fd < 0) perror("open"); else { char *buf = Time(); strcat(buf,s); write(fd,buf,MAXSIZE); write(fd,"
    "
    ,2); lseek(fd,0,SEEK_END); if(res < 0) perror("write"); } } int main() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in saddr, caddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(6666); saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); res = bind(sockfd,(struct sockaddr*)&saddr, sizeof(saddr)); if(res < 0) perror("bind"); listen(sockfd, 5); // while(1) { int len = sizeof(caddr); int confd = accept(sockfd,(struct sockaddr*)&caddr, &len); if(confd < 0) { perror("accept"); continue; } else { save(inet_ntoa(caddr.sin_addr)); } printf("Accept confdis:%d, ip=%s
    "
    , confd,inet_ntoa(caddr.sin_addr)); pthread_t tid; pthread_create(&tid, NULL, pthread_chat, &confd); } }

    クライアント・コードは次のとおりです.
    //client.c	// 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include   
    #define MAXSIZE 128
    
    char news[MAXSIZE];
    int res;					// 
    int main()
    {
    	printf("------Welcome join the chat room-----
    "
    ); printf("If you want to quit,please input --bye--
    "
    ); int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(6666); saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); int confd = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr)); if(confd < 0) perror("connect"); while(1) { printf("Please input the news
    "
    ); fgets(news,MAXSIZE,stdin); if(strncmp(news,"bye",3) == 0) { break; } send(sockfd, news, strlen(news), 0); memset(news,0,MAXSIZE); recv(sockfd, news, sizeof(news), 0); printf("The serve's news is: %s
    "
    ,news); } close(sockfd); exit(0); }

    プログラム操作方法:(プログラムコンパイル時に-lpthreadパラメータを追加する必要がある)
  • は、端末でサーバプログラム
  • を実行する.
  • 新規端末(複数の端末)がクライアントプログラム
  • を実行する.
  • クライアント/サーバにデータを入力し、メッセージは
  • を表示することができる.
  • クライアントはbyeを入力後、サーバとの接続を切断する
  • .
  • サーバプログラムを閉じると、ログファイル
  • を表示できます.