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;
}

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

(0)

相关推荐

  • C++实现多人聊天室

    本文实例为大家分享了C++实现多人聊天室的具体代码,供大家参考,具体内容如下 UDP 服务端代码: // Test_Console.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <WinSock2.h> #include <WS2tcpip.h> #include <Windows.h> #include <thread> #i

  • C++实现Window环境聊天室功能

    C++ Window环境聊天室,供大家参考,具体内容如下 最近闲来无事,想学习一下C++的并发编程和Socket信息传输,故以聊天室为载体进行学习.话不多说,代码开干. 聊天室分为多个客户端和一个服务器.服务器负责接收各个客户端传来的信息,然后转发给各个客户端,起到"中介"的作用:而客户端可以发送消息,并接收消息. 1.服务端 根据上述所说,一个服务器需要做的事: ① 接受新的客户端连接请求 ② 聆听各个已连接的客户端的新消息 ③ 将收到的信息逐个传送给各个已连接的服务器 所以,我设置

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

    本文实例为大家分享了C++基于socket编程实现聊天室的具体代码,供大家参考,具体内容如下 服务端 // server.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include "pch.h" #include <iostream> #include "winsock2.h" #include "stdlib.h" #include "stdio.h"

  • unity使用socket编程实现聊天室功能

    本文实例为大家分享了unity使用socket实现聊天室功能的具体代码,供大家参考,具体内容如下 示例: 什么是Socket: Socket(套接字),用来描述IP地址和端口,是通信链的句柄,应用程序可以通过Socket向网络发送请求或者应答网络请求!Socket是支撑TCP/IP协议的网络通信的基本操作单元,是对网络通信过程中端点的抽象表示,包含了进行网络通信所必须的五种信息:连接使用的协议,本地主机的IP地址,本地远程的协议端口,远地主机的IP地址,远地进程的协议端口. 通信模型: 服务端实

  • C#基于Socket实现简单聊天室功能

    因为这段时间在学习Socket,所以就试着写了一个简单的聊天室.主要分为服务器端和多个客户端.利用服务器端作数据中转站,实现消息群发. 1.服务器端有两个类: using System.Collections.Generic; using System.Net; using System.Net.Sockets; namespace 聊天室_Socket_TCP_服务器端 {     class Program     {         static List<Client> clients

  • Java基于socket实现简易聊天室实例

    本文实例讲述了Java基于socket实现简易聊天室的方法.分享给大家供大家参考.具体实现方法如下: chatroomdemo.java package com.socket.demo; import java.io.IOException; import java.net.DatagramSocket; public class ChatRoomDemo { /** * @param args * @throws IOException */ public static void main(S

  • Python基于Socket实现简单聊天室

    本文实例为大家分享了Python基于Socket实现简单聊天室,供大家参考,具体内容如下 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/7/27 15:34 # @File : Server.py """ 聊天室服务端 """ import socket,select host='' port=7799 addr=(host,port) inputs=[] mem

  • Java Socket通信之聊天室功能

    本文实例为大家分享了Java Socket聊天室功能的具体代码,供大家参考,具体内容如下 Client.java import java.io.*; import java.net.*; import java.util.*; public class Client { public int port = 8083; Socket socket = null; public static void main(String[] args) { new Client(); //开始执行 } publ

  • 基于C++实现TCP聊天室功能

    本文实例为大家分享了C++实现TCP聊天室功能的具体代码,供大家参考,具体内容如下 TCPServer.cpp: // TCPServer.cpp : Defines the entry point for the console application. #include "stdafx.h" #include<iostream> #include<stdio.h> #include<WinSock2.h> using namespace std;

  • node+socket实现简易聊天室功能

    本文实例为大家分享了node+socket实现简易聊天室的具体代码,供大家参考,具体内容如下 服务端 const net = require('net') const server = net.createServer() //用户列表 let clients = [] //监听连接 server.on('connection',client=>{ client.on('data',(chunk)=>{ let data = chunk.toString() if(data.match(/lo

  • Java基于UDP协议的聊天室功能

    UDP简述 UDP(User Datagram Protocol)协议是Internet 协议集支持的一个无连接的传输协议,中文名为用户数据报协议.它为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法. Internet 的传输层有两个主要协议,互为补充.无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情.面向连接的是TCP,该协议几乎做了所有的事情.“when in trouble , use TCP”. 那

  • C++基于socket UDP网络编程实现简单聊天室功能

    本文实例为大家分享了C++基于socket UDP实现简单聊天室功能的具体代码,供大家参考,具体内容如下 0.通信步骤流程图 (左:服务器:右:客户端:) 1.服务器代码 1.1服务器类头文件(CServer_UDP.h) #pragma once #include <winsock2.h> class CServer_UDP { public: CServer_UDP(); void SendMsg(const char sendBuf[]); void RecMsg(); ~CServer

随机推荐