Linuxc之基於TCP通訊聊天室
阿新 • • 發佈:2019-02-14
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;
}
{
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;
}