linux——服务器与客户端实现聊天功能
生活随笔
收集整理的這篇文章主要介紹了
linux——服务器与客户端实现聊天功能
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
先聯(lián)想一下聊天的場(chǎng)景,假設(shè)甲和乙在聊天,他們每個(gè)人都能夠發(fā)送給對(duì)方一句話甚至多句話,也能接收到對(duì)方發(fā)來(lái)的一句或多句話,也就是說(shuō),甲在發(fā)送一句話給乙的時(shí)候,同時(shí)也能接收到乙發(fā)來(lái)的信息,而且甲還能連續(xù)發(fā)多條信息,對(duì)于乙來(lái)說(shuō)也是一樣。這也就是說(shuō)程序當(dāng)中必須要有兩個(gè)執(zhí)行流,一個(gè)用于發(fā)信息,一個(gè)用于接受信息。
服務(wù)器
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <pthread.h> #include <arpa/inet.h>pthread_t r_tid=0,w_tid=0;void *do_read(void *client_sockid_) {int client_sockid=*((int *)client_sockid_);char send[100]={0};while(1){fgets(send,sizeof(send),stdin);if(strcmp(send,"NULL\n")==0){printf("您已下線\n");break;}write(client_sockid,send,sizeof(send));memset(send,0,strlen(send));}pthread_cancel(w_tid);//結(jié)束發(fā)送操作線程 }void *do_write(void *client_sockid_) {int client_sockid=*((int *)client_sockid_);char receive[100]={0};while(1){if(!read(client_sockid,receive,sizeof(receive))){printf("對(duì)方已下線,已退出\n");break;}printf("\t\t\t");fputs(receive,stdout);memset(receive,0,sizeof(receive));}pthread_cancel(r_tid);//結(jié)束接收操作線程 }int internet() {struct sockaddr_in sockaddr;sockaddr.sin_family=AF_INET;sockaddr.sin_port=htons(5188);sockaddr.sin_addr.s_addr=htonl(INADDR_ANY);int sockid=socket(AF_INET,SOCK_STREAM,0);const int on=1;if(setsockopt(sockid,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))<0){printf("setsockopt\n");return 0;}if(bind(sockid,(struct sockaddr *)&sockaddr,sizeof(sockaddr))<0){printf("bind\n");return 0;}if(listen(sockid,SOMAXCONN)<0){printf("listen\n");return 0;}struct sockaddr_in other_sock_addr;socklen_t other_sock_addr_len=sizeof(other_sock_addr);pid_t pid=0;int client_sockid=0;client_sockid=accept(sockid,(struct sockaddr *)&other_sock_addr,&other_sock_addr_len);printf("ip=%s,port=%d\n",inet_ntoa(other_sock_addr.sin_addr),ntohs(other_sock_addr.sin_port));if(client_sockid<0){printf("accept\n");return 0;}pthread_create(&r_tid,NULL,do_read,(void *)&client_sockid);pthread_create(&w_tid,NULL,do_write,(void *)&client_sockid);pthread_join(r_tid,NULL);pthread_join(w_tid,NULL);close(sockid);close(client_sockid); }int main() {internet();return 0; }客戶端
#include <stdio.h> #include <string.h> #include <unistd.h> #include <pthread.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>pthread_t r_tid=0,w_tid=0;void *do_read(void *sockid_) {int sockid=*((int *)sockid_);char send[100]={0};while(1){fgets(send,sizeof(send),stdin);if(strcmp(send,"NULL\n")==0){printf("您已下線\n");break;}write(sockid,send,sizeof(send));memset(send,0,strlen(send));}pthread_cancel(w_tid);//結(jié)束發(fā)送操作線程 }void *do_write(void *sockid_) {int sockid=*((int *)sockid_);char receive[100]={0};while(1){if(!read(sockid,receive,sizeof(receive))){printf("對(duì)方已下線,即將退出\n");break;}printf("\t\t\t");fputs(receive,stdout);memset(receive,0,sizeof(receive));}pthread_cancel(r_tid);//結(jié)束接收操作進(jìn)程 }int internet() {struct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(5188);addr.sin_addr.s_addr=inet_addr("127.0.0.1");int sockid=socket(AF_INET,SOCK_STREAM,0);socklen_t addrlen=sizeof(addr);if(connect(sockid,(struct sockaddr *)&addr,addrlen)<0){printf("connect\n");return 0;}pthread_create(&r_tid,NULL,do_read,(void *)&sockid);pthread_create(&w_tid,NULL,do_write,(void *)&sockid);pthread_join(r_tid,NULL);pthread_join(w_tid,NULL);close(sockid);return 0; }int main() {internet();return 0; }以上程序只能在局域網(wǎng)內(nèi)通信。實(shí)現(xiàn)跨局域網(wǎng)聊天請(qǐng)點(diǎn)擊
總結(jié)
以上是生活随笔為你收集整理的linux——服务器与客户端实现聊天功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux新安装后设置root密码
- 下一篇: linux——客户端服务器文件传输