linux——服务器与客户端实现聊天功能
生活随笔
收集整理的這篇文章主要介紹了
linux——服务器与客户端实现聊天功能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
先聯想一下聊天的場景,假設甲和乙在聊天,他們每個人都能夠發送給對方一句話甚至多句話,也能接收到對方發來的一句或多句話,也就是說,甲在發送一句話給乙的時候,同時也能接收到乙發來的信息,而且甲還能連續發多條信息,對于乙來說也是一樣。這也就是說程序當中必須要有兩個執行流,一個用于發信息,一個用于接受信息。
服務器
#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);//結束發送操作線程 }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("對方已下線,已退出\n");break;}printf("\t\t\t");fputs(receive,stdout);memset(receive,0,sizeof(receive));}pthread_cancel(r_tid);//結束接收操作線程 }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);//結束發送操作線程 }void *do_write(void *sockid_) {int sockid=*((int *)sockid_);char receive[100]={0};while(1){if(!read(sockid,receive,sizeof(receive))){printf("對方已下線,即將退出\n");break;}printf("\t\t\t");fputs(receive,stdout);memset(receive,0,sizeof(receive));}pthread_cancel(r_tid);//結束接收操作進程 }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; }以上程序只能在局域網內通信。實現跨局域網聊天請點擊
總結
以上是生活随笔為你收集整理的linux——服务器与客户端实现聊天功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux新安装后设置root密码
- 下一篇: python+opencv实现机器视觉基