解决方案

【C语言】实现简易网络聊天室

seo靠我 2023-09-26 02:48:32

项目:

制作一个简易的聊天室,实现实时非单机聊天

知识点:

总体框架:

socket() 创造套接字函数:

然后设置 bind() ,调整 IP 参数:

然后设置 listen() : 

然后设置 accept() SEO靠我

收发数据 recv(), send()/sendto(), read(), write() :

最后关闭 close() :

因为本身 socket 是一种文件描述符,所以最后要关闭打开的文件

 服务端:

1SEO靠我.创建sd

//创建sdsd = socket(AF_INET,SOCK_STREAM,0);if(sd == -1){perror("create sd failed");return -1;}

2.配SEO靠我置ip,端口属性

//设置ip,端口server_ip.sin_family = AF_INET;server_ip.sin_port = htons(5678);server_ip.sin_addr.SEO靠我s_addr = htonl(INADDR_ANY);memset(server_ip.sin_zero,0,8);

3.绑定ip和客户端 

//绑定ip和客户端error = bind(sd,(strucSEO靠我t sockaddr *) (&server_ip),sizeof(struct sockaddr));if(error == -1){perror("create bind failed");cloSEO靠我se(sd);return -1;}

4.设置最大链接数,这个宏定义MAX_LISLEN=2,因为我这里只连接2个客户端,可以设置多个

//设置最大链接数error = listen(sd, MAX_LISEO靠我SLEN);if(error == -1){perror("create listem failed");close(sd);return -1;}

 5.等待客户端连接

ad[i] = accept(sdSEO靠我,(struct sockaddr *)(&remote_ip),&remote_len);if(ad[i] == -1){perror("create ad failed");close(sd);rSEO靠我eturn -1;}

6.创造新线程,不断读取客户端发送的数据,别写入另外一个客户端

void * pthread_fun(void * arg) {while(1){memset(bufSEO靠我,0,100);read(ad[(int )arg],buf,100);write(ad[((int )arg + 1) % 2],buf,100);}return (void *) 0; SEO靠我 }

客户端 :

 1.创建sd

//创建sdsd = socket(AF_INET,SOCK_STREAM,0);if(sd == -1){perror("create sd failed");retuSEO靠我rn -1;}

2.配置ip,端口属性

//设置ip,端口server_ip.sin_family = AF_INET;server_ip.sin_port = htons(5678);server_ipSEO靠我.sin_addr.s_addr = htonl(INADDR_ANY);memset(server_ip.sin_zero,0,8);

3.连接服务端

//链接服务端error = connect(sdSEO靠我, (struct sockaddr *) (&server_ip),sizeof(struct sockaddr));if(error == -1){perror("create connect fSEO靠我ailed");close(sd);return -1;}

 4.创建两个新线程,不断写数据个服务端,不断从服务端读数据

void * pthread_fun_write(void * arg) SEO靠我 {while(1){memset(buf_write,0,100);scanf("%s",buf_write);write(sd,buf_write,100);} } SEO靠我 void * pthread_fun_read(void * arg) {while(1){memset(buf_read,0,100);read(sd,buf_read,100SEO靠我);printf("client2:%s\n",buf_read);} }

附录 

服务端代码

#include<stdio.h> #include<pthread.h> SEO靠我 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <strinSEO靠我g.h> #include <arpa/inet.h> #include <unistd.h> #include <netinet/in.h> SEO靠我 #include <unistd.h> #define MAX_LISLEN 2 char buf_write[100]; char buf[1SEO靠我00]; int ad[2]; struct sockaddr_in server_ip, remote_ip; void * pthread_fun(SEO靠我void * arg) {while(1){memset(buf,0,100);read(ad[(int )arg],buf,100);write(ad[((int )arg + 1)SEO靠我 % 2],buf,100);}return (void *) 0; }int main() {pthread_t tid[2];int server_len , reSEO靠我mote_len;int error, sd ;int i = 0;//创建sdsd = socket(AF_INET, SOCK_STREAM ,0);if(sd == -1){perror("crSEO靠我eate sd failed");return -1;//close(sd);}//设置ip,端口server_ip.sin_family = AF_INET;server_ip.sin_port =SEO靠我 htons(5678);server_ip.sin_addr.s_addr = htonl(INADDR_ANY);memset(server_ip.sin_zero,0,8);//绑定ip和客户端SEO靠我error = bind(sd,(struct sockaddr *) (&server_ip),sizeof(struct sockaddr));if(error == -1){perror("crSEO靠我eate bind failed");close(sd);return -1;}//设置最大链接数error = listen(sd, MAX_LISLEN);if(error == -1){perrSEO靠我or("create listem failed");close(sd);return -1;}remote_len = sizeof(struct sockaddr);while(1){//等待客户SEO靠我端申请ad[i] = accept(sd,(struct sockaddr *)(&remote_ip),&remote_len);if(ad[i] == -1){perror("create ad SEO靠我failed");close(sd);return -1;} else{printf("client%d 加入聊天室\n",i+1);} //新线程,功能:不断读数据error = pthread_cSEO靠我reate(&tid[i],NULL,pthread_fun,(void*) i);if(error != 0){perror("create pthread_fun failed");close(aSEO靠我d[i]);close(sd);return -1;} i++;}close(sd);return 0;}

客户端1代码 

#include<stdio.h> #include<pthreaSEO靠我d.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #includeSEO靠我 <string.h> #include <arpa/inet.h> #include <unistd.h> #include <netinet/in.SEO靠我h> #include <unistd.h> int sd; char buf_write[100]; char buf_read[10SEO靠我0]; struct sockaddr_in server_ip, remote_ip; void * pthread_fun_write(void * arg) SEO靠我 {while(1){memset(buf_write,0,100);scanf("%s",buf_write);write(sd,buf_write,100);} } SEO靠我 void * pthread_fun_read(void * arg) {while(1){memset(buf_read,0,100);read(sd,buf_read,SEO靠我100);printf("client2:%s\n",buf_read);} }int main() {int server_len,remote_len;pthreaSEO靠我d_t tid_read,tid_write;int error;sd = socket(AF_INET,SOCK_STREAM,0);if(sd == -1){perror("create sd fSEO靠我ailed");return -1;}//设置ip,端口server_ip.sin_family = AF_INET;server_ip.sin_port = htons(5678);server_iSEO靠我p.sin_addr.s_addr = htonl(INADDR_ANY);memset(server_ip.sin_zero,0,8);//链接服务端error = connect(sd, (strSEO靠我uct sockaddr *) (&server_ip),sizeof(struct sockaddr));if(error == -1){perror("create connect failed"SEO靠我);close(sd);return -1;}error = pthread_create(&tid_write,NULL,pthread_fun_write,NULL);if(error != 0)SEO靠我{perror("create pthread write failed");close(sd);return -1;} error = pthread_create(&tid_read,NULL,pSEO靠我thread_fun_read,NULL);if(error != 0){perror("create pthread read failed");close(sd);return -1;} pthrSEO靠我ead_join(tid_write,NULL);pthread_join(tid_read,NULL);return 0; }

客户端2代码 

#include<stdio.h> SEO靠我 #include<pthread.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.SEO靠我h> #include <string.h> #include <arpa/inet.h> #include <unistd.h> #iSEO靠我nclude <netinet/in.h> #include <unistd.h> int sd; char buf_write[100]; SEO靠我 char buf_read[100]; struct sockaddr_in server_ip, remote_ip; void * pthread_fun_wSEO靠我rite(void * arg) {while(1){memset(buf_write,0,100);scanf("%s",buf_write);write(sd,buf_write,SEO靠我100);} } void * pthread_fun_read(void * arg) {while(1){memset(buf_read,0,100SEO靠我);read(sd,buf_read,100);printf("client1:%s\n",buf_read);} }int main() {int server_leSEO靠我n,remote_len;pthread_t tid_read,tid_write;int error;sd = socket(AF_INET,SOCK_STREAM,0);if(sd == -1){SEO靠我perror("create sd failed");return -1;}//设置ip,端口server_ip.sin_family = AF_INET;server_ip.sin_port = hSEO靠我tons(5678);server_ip.sin_addr.s_addr = htonl(INADDR_ANY);memset(server_ip.sin_zero,0,8);error = connSEO靠我ect(sd, (struct sockaddr *) (&server_ip),sizeof(struct sockaddr));if(error == -1){perror("create conSEO靠我nect failed");close(sd);return -1;}error = pthread_create(&tid_write,NULL,pthread_fun_write,NULL);ifSEO靠我(error != 0){perror("create pthread write failed");close(sd);return -1;} error = pthread_create(&tidSEO靠我_read,NULL,pthread_fun_read,NULL);if(error != 0){perror("create pthread read failed");close(sd);retuSEO靠我rn -1;} pthread_join(tid_write,NULL);pthread_join(tid_read,NULL);return 0; }

写运行服务端创建sd,再运行客户SEO靠我端连接服务端,再不断加入客户端,注意最大加入数

运行结果:

想得美,直接动手

“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2