程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Linux下GNU C實現的簡單聊天室程序

Linux下GNU C實現的簡單聊天室程序

編輯:關於C語言

閒暇之余,利用linux下的多線程和網絡知識,寫了個簡單多人聊天程序,意在說明用GNU C寫網絡類程序的步驟和需要注意的問題以及linux多線程的使用方法。

編譯:
gcc -Wall -o server -lpthread server.c
gcc -Wall -o client -lpthread client.c

服務器端:C代碼 
#include <sys/types.h>  
#include <sys/socket.h>  
#include <sys/wait.h>  
#include <stdio.h>  
#include <stdlib.h>  
#include <errno.h>  
#include <string.h>  
#include <sys/un.h>  
#include <sys/time.h>  
#include <sys/ioctl.h>  
#include <unistd.h>  
#include <netinet/in.h>  
#include <pthread.h>  
 
//定義同時聊天的人數  
#define COUNT 5  
 
//保存socket  
int socket_fd[COUNT];  
 
//線程的入口函數  
void pthread_function(int client_fd){  
    char message[1500];  
    char buf[1024];  
    int i,recvbytes;  
    char name[20];  
    //首次連接時,接受並保存客戶端名字  
    recvbytes = recv(client_fd, name, 20, 0);  
    name[recvbytes]=:;      
    name[recvbytes+1]=;  
    while(1){  
        if((recvbytes = recv(client_fd, buf, 1024, 0))==-1){  
            perror("recv error");  
            exit(1);  
        }  
        if(recvbytes==0){  
            printf("%sbye! ",name);  
            break;        
        }  
        buf[recvbytes]=;  
        for(i=0;i<COUNT;i++){  
            if(socket_fd[i]==-1){  
                continue;  
            }else{  
                message[0]=;  
                strcat(message,name);  
                strcat(message,buf);  
                if(send(socket_fd[i],message,strlen(message),0)==-1){  
                    perror("send error");  
                    exit(1);  
                }             
            }  
        }  
    }  
    //斷開時關閉socket,並將描述符值置為-1  
    close(client_fd);  
    for(i=0;i<COUNT;i++){  
        if(socket_fd[i]==client_fd){  
            socket_fd[i]=-1;  
        }  
    }  
    //退出線程  
    pthread_exit(NULL);  
}  
 
int main(){  
 
    //初始化socket數組  
    int i;  
    for(i=0;i<COUNT;i++){  
        socket_fd[i]=-1;  
    }  
    pthread_t id;     
    int sockfd,client_fd;  
    socklen_t sin_size;  
    struct sockaddr_in my_addr;  
    struct sockaddr_in remote_addr;  
    if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){  
        perror("socket");  
        exit(1);  
    }  
    //配置信息  
    my_addr.sin_family=AF_INET;  
    my_addr.sin_port=htons(12345);   
    my_addr.sin_addr.s_addr=INADDR_ANY;  
    bzero(&(my_addr.sin_zero),8);  
    //綁定  
    if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){  
        perror("bind");  
        exit(1);  
    }  
    //監聽  
    if(listen(sockfd,10)==-1){  
        perror("listen");  
        exit(1);  
    }  
    i=0;  
    while(1){  
        sin_size=sizeof(struct sockaddr_in);  
        if((client_fd=accept(sockfd,(struct sockaddr *)&remote_addr,&sin_size))==-1){  
            perror("accept");  
            exit(1);  
        }  
        //找到一個可用的socket位置  
        while(socket_fd[i]!=-1)  
            i=(i+1)%COUNT;  
        //保存socket並啟動線程處理  
        socket_fd[i]=client_fd;  
        pthread_create(&id,NULL,(void *)pthread_function,(int *)client_fd);  
    }  

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/un.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unis

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved