Linux下后台服务器开发_基于多线程的一对一QQ聊天室
废话不多说直接上干货
1.目标
在实现回声服务器和客户端后 ,基于多线程设计一对一的聊天室
2.功能
在本机上实现客户端与服务器的实时聊天测试 以达到练习强化socket通信/多线程技术的目的
3.测试
客户端主线程 与两个子线程
服务器主线程 与两个子线程
能够相互收到信息 并且进行应答
最后关闭socket
代码如下:
客户端:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<pthread.h>#define BUF_SIZE 1024
#define SERVER_PORT 666
#define SERVER_IP "127.0.0.1"char buf_send[BUF_SIZE]={0};
char buf_recv[BUF_SIZE]={0};//发送线程功能函数
void * sendMsg(void * socket){int *client_sock = (int *)socket;while(1){scanf("%s",buf_send);//buf_send表示数组元素首地址 此时再往里边输入数据 会覆盖掉原数据send(*client_sock, buf_send, strlen(buf_send), 0);//因为第一个形参传过来的是个地址所以加*号才是int//退出发送if(!strncasecmp(buf_send, "quit", 4)){//该函数就是对比第一个字符串和第二个字符串 的前4个字符是否相等 相等返回零break;}}pthread_exit(NULL);
}//接受线程功能函数
void * recvMsg(void * socket){int *client_sock = (int *)socket;while(1){bzero(buf_recv, BUF_SIZE);//先把buf清零if(recv(*client_sock, buf_recv, BUF_SIZE, 0)>0){printf("Msg from server: %s\n", buf_recv);}if(!strncasecmp(buf_send, "quit", 4)){//该函数就是对比第一个字符串和第二个字符串 的前4个字符是否相等 相等返回零break;}}pthread_exit(NULL);}//客户端首先创建一个socket
//绑定想要连接的服务器的IP和端口号 然后调用connect函数通过socket去连接服务器
int main()
{int sockfd;struct sockaddr_in servaddr;int n;sockfd=socket(AF_INET, SOCK_STREAM, 0);memset(&servaddr, '\0', sizeof(struct sockaddr_in));//此处需要标明服务器的IP和端口servaddr.sin_family=AF_INET;//将IP和端口号进行转化 转化为网络字节序 就是socket函数使用的IP和端口格式inet_pton(AF_INET, SERVER_IP, &servaddr.sin_addr);servaddr.sin_port = htons(SERVER_PORT);if((connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)))>=0){printf("连接成功!\n");}if((recv(sockfd, buf_recv, BUF_SIZE, 0))>0){printf("message from server: %s\n", buf_recv);}//创建线程用于收发pthread_t send_tid, recv_tid;pthread_create(&send_tid, NULL, sendMsg, (void *)&sockfd);pthread_create(&recv_tid, NULL, recvMsg, (void *)&sockfd);//此函数表示 子线程 结束 才能执行 主线程中后边的函数(防止子线程被中断)pthread_join(send_tid, NULL);pthread_join(recv_tid, NULL);close(sockfd);return 0;
}
服务器:
#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<netinet/in.h>#define SERVER_PORT 666
#define BUF_SIZE 1024char buf_send[BUF_SIZE] = "connection succeeded";
char buf_recv[BUF_SIZE];//发送线程功能函数
void * sendMsg(void * socket){int *client_sock = (int *)socket;while(1){scanf("%s",buf_send);//buf_send表示数组元素首地址 此时再往里边输入数据 会覆盖掉原数据send(*client_sock, buf_send, strlen(buf_send), 0);//因为第一个形参传过来的是个地址所以加*号才是int//退出发送if(!strncasecmp(buf_send, "quit", 4)){//该函数就是对比第一个字符串和第二个字符串 的前4个字符是否相等 相等返回零break;}}pthread_exit(NULL);
}//接受线程功能函数
void * recvMsg(void * socket){int *client_sock = (int *)socket;while(1){bzero(buf_recv, BUF_SIZE);//先把buf清零if(recv(*client_sock, buf_recv, BUF_SIZE, 0)>0){printf("Msg from client: %s\n", buf_recv);}if(!strncasecmp(buf_send, "quit", 4)){//该函数就是对比第一个字符串和第二个字符串 的前4个字符是否相等 相等返回零break;}}pthread_exit(NULL);}int main()
{int sock;//信箱int i;struct sockaddr_in server_addr;sock = socket(AF_INET, SOCK_STREAM, 0);//创建信箱bzero(&server_addr,sizeof(server_addr));//清空标签server_addr.sin_family=AF_INET;//选择协议族server_addr.sin_addr.s_addr=htonl(INADDR_ANY);//监听本地所有IPserver_addr.sin_port=htons(SERVER_PORT);//绑定端口号bind(sock,(struct sockaddr *)&server_addr,sizeof(server_addr));//绑定IP和端口listen(sock,128);//监听客户端printf("等待客户端的连接\n");struct sockaddr_in client;int client_sock, len;char client_ip[32];//用来存客户端IP和端口 打印// char buf[256];//用来接客户端的数据socklen_t client_addr_len;client_addr_len = sizeof(client);client_sock = accept(sock, (struct sockaddr*)&client, &client_addr_len);printf("client ip:%s\t port:%d\n",inet_ntop(AF_INET,&client.sin_addr.s_addr,client_ip,sizeof(client_ip)),ntohs(client.sin_port));send(client_sock, buf_send, strlen(buf_send), 0);//建立连接成功,给客户端发一条信息//创建线程用于收发pthread_t send_tid, recv_tid;pthread_create(&send_tid, NULL, sendMsg, (void *)&client_sock);pthread_create(&recv_tid, NULL, recvMsg, (void *)&client_sock);//此函数表示 子线程 结束 才能执行 主线程中后边的函数(防止子线程被中断)pthread_join(send_tid, NULL);pthread_join(recv_tid, NULL);close(client_sock);close(sock);printf("finshed!\n");return 0;}
重点:编译的时候 一定要加 -lpthread (多线程)
结果:
后边有时间会接着改进,调试多人聊天模式,
有兴趣的可以一起来讨论交流,
待续。。。
Linux下后台服务器开发_基于多线程的一对一QQ聊天室相关推荐
- linux安装基于PHP的web软件,Linux下Web服务器应用之基于LAMP构建phpwind论坛
Linux下Web服务器应用之 基于LAMP构建phpwind论坛 v什么是LAMP Ü目前最为成熟的一种企业网站应用模式,可提供动态Web站点应用及开发环境 v构成组件 ÜLinux.Apache. ...
- 网络编程-基于MFC的仿QQ聊天室-2020
基于MFC的仿QQ聊天室(2020) 有幸学习过网络编程的一些知识,出于对编程的热爱,把曾经的一次简单实践编程作业进行了自定义的完成. 编程所需: 编程工具为VS 2010,需要掌握MFC的基本操作以 ...
- Linux下Web服务器开发
代码下载地址:http://download.csdn.net/detail/u010959074/9572149 以下是项目介绍. 学习提示: 1. 在"桌面环境"中动手练习,若 ...
- 应届生怎么走Linux下C++后台服务器开发路线,工作3-5年的知识体系
1. 前言 给最近正在准备秋招的同学或者是想转行,目标岗位是C++后端开发工程师,这个岗位对开发者的要求也比较高,需要的基础知识非常多,刚刚开始准备的时候,感觉也是不知从何入手,现在经过了一段时间的学 ...
- C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2021架构师篇完整版)
C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2021架构师篇完整版) 前言: 小编之前有跟大家分享过一篇架构师体系知识点总结的文章,今天在原来的基础上有所改变更新(2021版). ...
- C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2022架构师篇完整版)
C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2021架构师篇完整版) 前言: 小编之前有跟大家分享过一篇架构师体系知识点总结的文章,今天在原来的基础上有所改变更新(2021版). ...
- C/C++ Linux 后台服务器开发高级架构师学习知识路(架构师篇)
@[前言: 小编从事c方面10多年的工作经验.今天跟大家分享一下我总结出来的一系列 C/C Linux后台服务器开发的学习路线.从Linux开发工程师-Linux后台开发工程师-Linux高级互联网架 ...
- ngrok服务器搭建_C/C++ Linux 后台服务器开发高级架构师学习知识路线总结
前言: 小编也是从事c方面10多年的工作经验.今天跟大家分享一下我总结出来的一系列 C/C Linux后台服务器开发的学习路线.从Linux开发工程师-Linux后台开发工程师-Linux高级互联网架 ...
- C/C++ Linux 后台服务器开发高级架构师学习知识路线总结
前言: 小编也是从事c方面10多年的工作经验.今天跟大家分享一下我总结出来的一系列 C/C Linux后台服务器开发的学习路线.从Linux开发工程师-Linux后台开发工程师-Linux高级互联网架 ...
最新文章
- open python语言实现 pdf_使用python操作Pdf代码实现
- C++ 多继承和虚继承的内存布局
- 企业搜索引擎开发之连接器connector(二十九)
- Windows7 IIS 500-内部服务器错误的解决方法
- 万万没想到,线程居然被饿死了!
- python api是什么_Python/C API
- 二叉搜索树相关知识及应用操作
- dubbo 支持服务降级吗_dubbo面试题!会这些,说明你真正看懂了dubbo源码
- linux调用python出错,linux里面python调用系统命令问题
- JavaScript学习(六十七)—正则表达式学习总结
- iOS 接入微信 支付宝 参数设置
- linux 运行 ccs,ccs_linux
- 【Visual C++】游戏开发笔记二十六 DirectX 11各组件的介绍第一个DirectX 11 Demo的创建
- boblog任意变量覆盖漏洞(二)
- 数字图像处理-知识点总结
- 面试题:Java多线程
- Java析构函数构造函数_C++ string构造函数和析构函数详解
- 06-作业练习盒子模型
- c语言如何画出多个散点图,如何制作多参数散点图
- python实现中撤销上一步的代码mac_苹果电脑command+z撤销后如何恢复撤销前的上一步?...
热门文章
- java后台怎么设置转盘抽奖_[Java教程]转盘抽奖
- 查看自己手机是否支持Google服务
- Fitbit Flex 智能手环佩戴心得 主要说说过敏
- 对标 Amazon Go,这家初创企业盯上了国内无人商店市场
- 彩光价格一般是多少_彩光祛斑价格一般是多少呢?
- 大数据基准测试平台BigDataBench5.0安装配置及使用
- 移动端一个按钮长按以及点击事件(js)
- 读取BIL格式高光谱数据——C/C++
- 【互联网的恩怨情仇】盘点2015年互联网十大撕逼事件
- Sqlserver修改表结构提示不允许保存更改。