C++基于socket编程实现聊天室功能

 更新时间:2021年07月01日 08:30:27   作者:Hugh677  
这篇文章主要介绍了C++基于socket编程实现聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C++基于socket编程实现聊天室的具体代码,供大家参考,具体内容如下

服务端

// server.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
 
#include "pch.h"
#include <iostream>
#include "winsock2.h"
#include "stdlib.h"
#include "stdio.h"
#include "string"
#pragma comment (lib, "ws2_32.lib")
 
using namespace std;
 
 
SOCKET clientSocket[1024];
int k = 0;
 
void communication(LPVOID n)
{
 char buff[256];
 int r;
 int i = (int)n;
 //cout << i << ":" << endl;
 while (1)
 {
 
  memset(buff, 0, 256);
  r = recv(clientSocket[i - 1], buff, 255, NULL);
  if (r > 0)
  {
   cout << i << ":" << buff << endl;
   for (int j = 0; j < k; j++)
   {
    send(clientSocket[j], buff, strlen(buff), NULL);
   }
  }
 
 }
}
 
 
int main()
{
 
 //加载socket库 版本号
 WSADATA wsaData;
 WSAStartup(MAKEWORD(2, 2), &wsaData) != 0;//成功==0
 if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
 {
  cout << "请求版本失败!\n" << endl;
  return -1;
 }
 cout << "请求版本成功!\n" << endl;
 //创建socket
 //sockSer = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);//AF=Address family ,ipv4,TCP,0
 SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 if (serverSocket == INVALID_SOCKET)
 {
  cout << "创建socket失败!\n" << endl;
  return -1;
 }
 cout << "创建socket成功!\n" << endl;
 //addrSer.sin_addr.S_un.S_addr
 SOCKADDR_IN addr = { 0 };
 
 //初始化地址
 addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");// htonl(INADDR_ANY);//inet_addr("192.168.0.13");//dec--->2进制-->网络字节序
 addr.sin_family = AF_INET;
 addr.sin_port = htons(10086);//端口号~65535
 //绑定Socket
 int r = bind(serverSocket, (SOCKADDR*)&addr, sizeof(addr));
 if (r == -1)
 {
  cout << "bind失败!\n" << endl;
  return -1;
 }
 cout << "bind成功!\n" << endl;
 //listen
 r = listen(serverSocket, 10);
 if (r == -1)
 {
  cout << "listen失败!\n" << endl;
  return -1;
 }
 cout << "listen成功!\n" << endl;
 //连接
 //地址族
 SOCKADDR_IN cAddr = { 0 };
 int len = sizeof cAddr;
 
 //SOCKET clientSocket[1024];
 int i = 0;
 while (i < 1024)
 {
  clientSocket[i++] = accept(serverSocket, (sockaddr*)&cAddr, &len);
  k++;
  if (clientSocket[i - 1] == SOCKET_ERROR)
  {
   cout << "错误的客户端!\n" << endl;
   closesocket(serverSocket);
   WSACleanup();
   return -1;
  }
  cout << "有客户端接入进来!" << inet_ntoa(cAddr.sin_addr) << endl;
  CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)communication, (LPVOID)i, NULL, NULL);
 }
 
 
 //closesocket(clientSocket);
 //closesocket(serverSocket);
 //WSACleanup();
 return 0;
}

客户端

#include "pch.h"
#include <iostream>
#include "winsock2.h"
#include "stdlib.h"
#include "stdio.h"
#include "string"
#pragma comment (lib, "ws2_32.lib")
 
//#include "graphics.h"
 
using namespace std;
 
SOCKET serverSocket;//服务器
 
 
void recvAndShow()
{
 int r, i = 0;
 char buff[256];
 //ofstream out;
 while (1)
 {
  memset(buff, 0, 256);
  r = recv(serverSocket, buff, 255, NULL);
  if (r > 0)
  {
  // out.open("QQ.txt", ios::app||ios::_Nocreate);
  // out << buff << endl;
   //outtextxy(0, i * 20, buff);
   i++;
   //out.close();
  }
 }
}
 
int main()
{
 //initgraph(300, 300, SHOWCONSOLE);
 //加载socket库 版本号
 
 WSADATA wsaData;
 WSAStartup(MAKEWORD(2, 2), &wsaData) != 0;//成功==0
 if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
 {
  cout << "请求版本失败!\n" << endl;
  return -1;
 }
 cout << "请求版本成功!\n" << endl;
 
 //创建socket
 
 serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 if (serverSocket == INVALID_SOCKET)
 {
  cout << "创建socket失败!\n" << endl;
  return -1;
 }
 cout << "创建socket成功!\n" << endl;
 
 //地址族
 
 SOCKADDR_IN addr = { 0 };
 
 //初始化地址
 
 addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");// htonl(INADDR_ANY);//inet_addr("192.168.0.13");//dec--->2进制-->网络字节序
 addr.sin_family = AF_INET;
 addr.sin_port = htons(10086);//端口号~65535尽量大于1W
 
 //连接到服务器
 
 int r = connect(serverSocket, (SOCKADDR*)&addr, sizeof addr);
 if (r == -1)
 {
  cout << "连接服务器失败!\n" << endl;
  return -1;
 }
 cout << "连接服务器成功!\n" << endl;
 
 CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)recvAndShow, NULL, NULL, NULL);
 
 char buff[256];
 while (1)
 {
  memset(buff, 0, 256);
  cout << "你要发啥?\n" << endl;
  cin >> buff;
  r = send(serverSocket, buff, strlen(buff), NULL);
  if (r > 0)
  {
   cout << "发送" << r << "字节到服务器成功!\n" << endl;
  }
 
 }
 //closesocket(serverSocket);
 //WSACleanup();
 return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。 

相关文章

  • QT实现简单时钟效果

    QT实现简单时钟效果

    这篇文章主要为大家详细介绍了QT实现简单时钟效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • 区分C++中的&和&&

    区分C++中的&和&&

    这篇文章主要介绍了如何区分C++的&和&&,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-09-09
  • C++ AnimeGAN实现照片一键动漫化

    C++ AnimeGAN实现照片一键动漫化

    AnimeGAN是是由神经网络风格迁移加生成对抗网络(GAN)而成,它是基于CartoonGAN的改进,并提出了一个更加轻量级的生成器架构。本文将介绍如何运用AnimeGAN实现照片一键动漫化,需要的可以参考一下
    2021-11-11
  • 一篇文章带你用C语言玩转结构体

    一篇文章带你用C语言玩转结构体

    本文主要介绍C语言 结构体的知识,学习C语言肯定需要学习结构体,这里详细说明了结构体并附示例代码,供大家参考学习,有需要的小伙伴可以参考下
    2021-09-09
  • C++笔记之std::future的用法小结

    C++笔记之std::future的用法小结

    std::future通常由某个Provider创建,与std::async一起使用,本文主要介绍了C++笔记之std::future的用法小结,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • OpenGL实现鼠标移动方块

    OpenGL实现鼠标移动方块

    这篇文章主要为大家详细介绍了OpenGL实现鼠标移动方块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • C语言如何建立动态链表问题

    C语言如何建立动态链表问题

    这篇文章主要介绍了C语言如何建立动态链表问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • C语言实题讲解快速掌握单链表上

    C语言实题讲解快速掌握单链表上

    单链表是后面要学的双链表以及循环链表的基础,要想继续深入了解数据结构以及C语言,我们就要奠定好这块基石!接下来就和我一起学习吧
    2022-04-04
  • 简要对比C语言中的setgid()函数和setregid()函数

    简要对比C语言中的setgid()函数和setregid()函数

    这篇文章主要介绍了C语言中的setgid()函数和setregid()函数的简要对比,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • C语言详细讲解通过递归实现扫雷的展开

    C语言详细讲解通过递归实现扫雷的展开

    windows自带的游戏《扫雷》是陪伴了无数人的经典游戏,本文将利用C语言实现这一经典的游戏,文中的示例代码讲解详细,感兴趣的可以学习一下
    2022-05-05

最新评论