废话不多说直接上干货

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聊天室相关推荐

  1. linux安装基于PHP的web软件,Linux下Web服务器应用之基于LAMP构建phpwind论坛

    Linux下Web服务器应用之 基于LAMP构建phpwind论坛 v什么是LAMP Ü目前最为成熟的一种企业网站应用模式,可提供动态Web站点应用及开发环境 v构成组件 ÜLinux.Apache. ...

  2. 网络编程-基于MFC的仿QQ聊天室-2020

    基于MFC的仿QQ聊天室(2020) 有幸学习过网络编程的一些知识,出于对编程的热爱,把曾经的一次简单实践编程作业进行了自定义的完成. 编程所需: 编程工具为VS 2010,需要掌握MFC的基本操作以 ...

  3. Linux下Web服务器开发

    代码下载地址:http://download.csdn.net/detail/u010959074/9572149 以下是项目介绍. 学习提示: 1. 在"桌面环境"中动手练习,若 ...

  4. 应届生怎么走Linux下C++后台服务器开发路线,工作3-5年的知识体系

    1. 前言 给最近正在准备秋招的同学或者是想转行,目标岗位是C++后端开发工程师,这个岗位对开发者的要求也比较高,需要的基础知识非常多,刚刚开始准备的时候,感觉也是不知从何入手,现在经过了一段时间的学 ...

  5. C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2021架构师篇完整版)

    C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2021架构师篇完整版) 前言: 小编之前有跟大家分享过一篇架构师体系知识点总结的文章,今天在原来的基础上有所改变更新(2021版). ...

  6. C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2022架构师篇完整版)

    C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2021架构师篇完整版) 前言: 小编之前有跟大家分享过一篇架构师体系知识点总结的文章,今天在原来的基础上有所改变更新(2021版). ...

  7. C/C++ Linux 后台服务器开发高级架构师学习知识路(架构师篇)

    @[前言: 小编从事c方面10多年的工作经验.今天跟大家分享一下我总结出来的一系列 C/C Linux后台服务器开发的学习路线.从Linux开发工程师-Linux后台开发工程师-Linux高级互联网架 ...

  8. ngrok服务器搭建_C/C++ Linux 后台服务器开发高级架构师学习知识路线总结

    前言: 小编也是从事c方面10多年的工作经验.今天跟大家分享一下我总结出来的一系列 C/C Linux后台服务器开发的学习路线.从Linux开发工程师-Linux后台开发工程师-Linux高级互联网架 ...

  9. C/C++ Linux 后台服务器开发高级架构师学习知识路线总结

    前言: 小编也是从事c方面10多年的工作经验.今天跟大家分享一下我总结出来的一系列 C/C Linux后台服务器开发的学习路线.从Linux开发工程师-Linux后台开发工程师-Linux高级互联网架 ...

最新文章

  1. open python语言实现 pdf_使用python操作Pdf代码实现
  2. C++ 多继承和虚继承的内存布局
  3. 企业搜索引擎开发之连接器connector(二十九)
  4. Windows7 IIS 500-内部服务器错误的解决方法
  5. 万万没想到,线程居然被饿死了!
  6. python api是什么_Python/C API
  7. 二叉搜索树相关知识及应用操作
  8. dubbo 支持服务降级吗_dubbo面试题!会这些,说明你真正看懂了dubbo源码
  9. linux调用python出错,linux里面python调用系统命令问题
  10. JavaScript学习(六十七)—正则表达式学习总结
  11. iOS 接入微信 支付宝 参数设置
  12. linux 运行 ccs,ccs_linux
  13. 【Visual C++】游戏开发笔记二十六 DirectX 11各组件的介绍第一个DirectX 11 Demo的创建
  14. boblog任意变量覆盖漏洞(二)
  15. 数字图像处理-知识点总结
  16. 面试题:Java多线程
  17. Java析构函数构造函数_C++ string构造函数和析构函数详解
  18. 06-作业练习盒子模型
  19. c语言如何画出多个散点图,如何制作多参数散点图
  20. python实现中撤销上一步的代码mac_苹果电脑command+z撤销后如何恢复撤销前的上一步?...

热门文章

  1. java后台怎么设置转盘抽奖_[Java教程]转盘抽奖
  2. 查看自己手机是否支持Google服务
  3. Fitbit Flex 智能手环佩戴心得 主要说说过敏
  4. 对标 Amazon Go,这家初创企业盯上了国内无人商店市场
  5. 彩光价格一般是多少_彩光祛斑价格一般是多少呢?
  6. 大数据基准测试平台BigDataBench5.0安装配置及使用
  7. 移动端一个按钮长按以及点击事件(js)
  8. 读取BIL格式高光谱数据——C/C++
  9. 【互联网的恩怨情仇】盘点2015年互联网十大撕逼事件
  10. Sqlserver修改表结构提示不允许保存更改。