欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++基于socket編程實(shí)現(xiàn)聊天室功能

 更新時(shí)間:2021年07月01日 08:30:27   作者:Hugh677  
這篇文章主要介紹了C++基于socket編程實(shí)現(xiàn)聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C++基于socket編程實(shí)現(xiàn)聊天室的具體代碼,供大家參考,具體內(nèi)容如下

服務(wù)端

// server.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。
//
 
#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庫 版本號(hào)
 WSADATA wsaData;
 WSAStartup(MAKEWORD(2, 2), &wsaData) != 0;//成功==0
 if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
 {
  cout << "請(qǐng)求版本失敗!\n" << endl;
  return -1;
 }
 cout << "請(qǐng)求版本成功!\n" << endl;
 //創(chuàng)建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 << "創(chuàng)建socket失敗!\n" << endl;
  return -1;
 }
 cout << "創(chuàng)建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進(jìn)制-->網(wǎng)絡(luò)字節(jié)序
 addr.sin_family = AF_INET;
 addr.sin_port = htons(10086);//端口號(hào)~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 << "錯(cuò)誤的客戶端!\n" << endl;
   closesocket(serverSocket);
   WSACleanup();
   return -1;
  }
  cout << "有客戶端接入進(jìn)來!" << 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;//服務(wù)器
 
 
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庫 版本號(hào)
 
 WSADATA wsaData;
 WSAStartup(MAKEWORD(2, 2), &wsaData) != 0;//成功==0
 if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
 {
  cout << "請(qǐng)求版本失敗!\n" << endl;
  return -1;
 }
 cout << "請(qǐng)求版本成功!\n" << endl;
 
 //創(chuàng)建socket
 
 serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 if (serverSocket == INVALID_SOCKET)
 {
  cout << "創(chuàng)建socket失敗!\n" << endl;
  return -1;
 }
 cout << "創(chuàng)建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進(jìn)制-->網(wǎng)絡(luò)字節(jié)序
 addr.sin_family = AF_INET;
 addr.sin_port = htons(10086);//端口號(hào)~65535盡量大于1W
 
 //連接到服務(wù)器
 
 int r = connect(serverSocket, (SOCKADDR*)&addr, sizeof addr);
 if (r == -1)
 {
  cout << "連接服務(wù)器失??!\n" << endl;
  return -1;
 }
 cout << "連接服務(wù)器成功!\n" << endl;
 
 CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)recvAndShow, NULL, NULL, NULL);
 
 char buff[256];
 while (1)
 {
  memset(buff, 0, 256);
  cout << "你要發(fā)啥?\n" << endl;
  cin >> buff;
  r = send(serverSocket, buff, strlen(buff), NULL);
  if (r > 0)
  {
   cout << "發(fā)送" << r << "字節(jié)到服務(wù)器成功!\n" << endl;
  }
 
 }
 //closesocket(serverSocket);
 //WSACleanup();
 return 0;
}

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。 

相關(guān)文章

  • QT實(shí)現(xiàn)簡單時(shí)鐘效果

    QT實(shí)現(xiàn)簡單時(shí)鐘效果

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)簡單時(shí)鐘效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 區(qū)分C++中的&和&&

    區(qū)分C++中的&和&&

    這篇文章主要介紹了如何區(qū)分C++的&和&&,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-09-09
  • C++?AnimeGAN實(shí)現(xiàn)照片一鍵動(dòng)漫化

    C++?AnimeGAN實(shí)現(xiàn)照片一鍵動(dòng)漫化

    AnimeGAN是是由神經(jīng)網(wǎng)絡(luò)風(fēng)格遷移加生成對(duì)抗網(wǎng)絡(luò)(GAN)而成,它是基于CartoonGAN的改進(jìn),并提出了一個(gè)更加輕量級(jí)的生成器架構(gòu)。本文將介紹如何運(yùn)用AnimeGAN實(shí)現(xiàn)照片一鍵動(dòng)漫化,需要的可以參考一下
    2021-11-11
  • 一篇文章帶你用C語言玩轉(zhuǎn)結(jié)構(gòu)體

    一篇文章帶你用C語言玩轉(zhuǎn)結(jié)構(gòu)體

    本文主要介紹C語言 結(jié)構(gòu)體的知識(shí),學(xué)習(xí)C語言肯定需要學(xué)習(xí)結(jié)構(gòu)體,這里詳細(xì)說明了結(jié)構(gòu)體并附示例代碼,供大家參考學(xué)習(xí),有需要的小伙伴可以參考下
    2021-09-09
  • C++筆記之std::future的用法小結(jié)

    C++筆記之std::future的用法小結(jié)

    std::future通常由某個(gè)Provider創(chuàng)建,與std::async一起使用,本文主要介紹了C++筆記之std::future的用法小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • OpenGL實(shí)現(xiàn)鼠標(biāo)移動(dòng)方塊

    OpenGL實(shí)現(xiàn)鼠標(biāo)移動(dòng)方塊

    這篇文章主要為大家詳細(xì)介紹了OpenGL實(shí)現(xiàn)鼠標(biāo)移動(dòng)方塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • C語言如何建立動(dòng)態(tài)鏈表問題

    C語言如何建立動(dòng)態(tài)鏈表問題

    這篇文章主要介紹了C語言如何建立動(dòng)態(tài)鏈表問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • C語言實(shí)題講解快速掌握單鏈表上

    C語言實(shí)題講解快速掌握單鏈表上

    單鏈表是后面要學(xué)的雙鏈表以及循環(huán)鏈表的基礎(chǔ),要想繼續(xù)深入了解數(shù)據(jù)結(jié)構(gòu)以及C語言,我們就要奠定好這塊基石!接下來就和我一起學(xué)習(xí)吧
    2022-04-04
  • 簡要對(duì)比C語言中的setgid()函數(shù)和setregid()函數(shù)

    簡要對(duì)比C語言中的setgid()函數(shù)和setregid()函數(shù)

    這篇文章主要介紹了C語言中的setgid()函數(shù)和setregid()函數(shù)的簡要對(duì)比,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • C語言詳細(xì)講解通過遞歸實(shí)現(xiàn)掃雷的展開

    C語言詳細(xì)講解通過遞歸實(shí)現(xiàn)掃雷的展開

    windows自帶的游戲《掃雷》是陪伴了無數(shù)人的經(jīng)典游戲,本文將利用C語言實(shí)現(xiàn)這一經(jīng)典的游戲,文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下
    2022-05-05

最新評(píng)論