1. 程式人生 > >Linuxc之基於TCP通訊聊天室

Linuxc之基於TCP通訊聊天室

int main()
{
 int fd;
 pthread_t thread1,thread2;
 struct sockaddr_in servaddr,cliaddr;
 socklen_t len;
 time_t ticks;
 char buff[MAXLINE];
 char addr_p[INET_ADDRSTRLEN];
 int n=0;
 
 //呼叫socket函式建立伺服器端的套接字
 printf("Socket...\n");
 listenfd=socket(AF_INET,SOCK_STREAM,0);
 if(listenfd<0){
  printf("Socket created failed.\n");
  return -1;
 }
 
 //呼叫bind函式使得伺服器端的套接字與地址實現繫結
 printf("Bind...\n");
 servaddr.sin_family=AF_INET;
 servaddr.sin_port=htons(8080);
 servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
 
 if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0){
  printf("Bind failed.\n");
  return -1;
 }
 
 //呼叫listen函式,將一個主動連線套接字變為被動的傾聽套接字
 //在此過程中完成tcp的三次握手連線
 printf("listening...\n");
 listen(listenfd,LISTENQ);
 
 //建立一個執行緒,對伺服器程式進行管理(關閉)
 pthread_create(&thread1,NULL,(void*)(&quit),NULL);
 
 //記錄空閒的客戶端的套接字描述符(-1為空閒)
 int i=0;
 for(i=0;i<MAXMEM;i++){
  connfd[i].fd=-1;
 }
 
 while(1){
  len=sizeof(cliaddr);
  
  for(i=0;i<MAXMEM;i++){
   if(connfd[i].fd==-1)
    break;
  }
  
  //呼叫accept函式從listen接受的連線佇列中取得一個連線
  connfd[i].fd=accept(listenfd,(struct sockaddr*)&cliaddr,&len);
  
  ticks=time(NULL);
  sprintf(buff,"%.25s \r\n",ctime(&ticks));
  inet_ntop(AF_INET,&cliaddr,addr_p,sizeof(addr_p));
  printf("第%d個客戶端連線成功\n",i+1);
  printf("%s Connect from: %s,port %d\n",buff,addr_p,ntohs(cliaddr.sin_port));   //列印客戶端連線的時間,地址和埠號
  //針對當前套接字建立一個執行緒,對當前套接字的訊息進行處理
  pthread_create(&thread2,NULL,(void*)(&rcv_snd),(void*)i);
 }
 pthread_join(thread2,NULL);
 pthread_join(thread1,NULL);
 close(fd);
 return 0;
}