windowsOS,C++使用UDP的简单的实现最最简单聊天

本文介绍了一个基于UDP协议的点对点(P2P)聊天程序的设计与实现,包括如何获取本地IP地址,创建服务器套接字,绑定端口,接收与发送信息的线程函数,以及主函数的调用流程。程序要求两台计算机在同一局域网下运行,且需正确设置双方的IP地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、首先是函数部分

一共包含三个函数,分别为:

1、 GetIP( )
用于获取自己的IP地址
2、 fun_send( )
用于发送信息的线程调用的函数
3、Server1()
用于接收信息的线程,在主线程中调用的函数

2、代码

server.h
#pragma once
#include<stdio.h>
#include <WinSock2.h>
#include <iostream>
#include<Thread>
#include <windows.h>
#include <winsock.h>
#include <string>
#pragma comment(lib,"ws2_32.lib")   //静态加入一个lib文件
#define DEFAULT_BUFFER         4096
#define DEFAULT_PORT           3600//5050
void Server1();
void fun_send(int a);
const char *GetIP();
server.cpp
#include"Server.h"
const char *GetIP(){
 char buff[256] = "0";
 struct hostent *ph = 0;
 WSADATA w;
 WSAStartup(0x0101, &w);//这一行必须在使用任何SOCKET函数前写!
 gethostname(buff, 256);
 ph = gethostbyname(buff);
 const char *IP = inet_ntoa(*((struct in_addr *)ph->h_addr_list[0]));//此处获得本机IP
 return IP;
 WSACleanup();
}
void Server1(){
 char *recvBuff;    //存放接收数据
 SOCKET sMe;
 int ret;
 int dwSenderSize;
 sockaddr_in MeAddr, PeerAddr;
 int iPort = DEFAULT_PORT;
 int dwLength = DEFAULT_BUFFER;
 recvBuff = new char[DEFAULT_BUFFER];   //不能太小。一般大于256 
 //创建服务器管套
 sMe = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
 if (sMe == SOCKET_ERROR)
 {
  printf("创建管套失败!\n");
  return;
 }
 //设置接自己的地址,端口号和地址族。这里主要是端口号。
 MeAddr.sin_family = AF_INET;
 MeAddr.sin_port = htons((short)iPort);
 MeAddr.sin_addr.s_addr = inet_addr(GetIP());//我的IP地址
 //ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
 ret = bind(sMe, (SOCKADDR *)&MeAddr, sizeof(MeAddr));
 if (ret == SOCKET_ERROR)
 {
  printf("BIND失败!\n");
  return;
 }
 while (1)
 {
  memset(recvBuff, 0, dwLength);
  dwSenderSize = sizeof(PeerAddr);
  ret = recvfrom(sMe, recvBuff, dwLength, 0, (SOCKADDR *)&PeerAddr, &dwSenderSize);
  if (ret == SOCKET_ERROR)
  {
   int  icode = WSAGetLastError();
   printf("Er=%d", icode);
   printf("recvfrom失败!\n");
   break;
  }
  else
  {
   printf("\n对方:");
   recvBuff[ret] = '\0';
   printf(recvBuff);
   printf("\n");
  }
 }
 closesocket(sMe);
 delete recvBuff;
}
void fun_send(int a){
 char *sendBuff;    //存放to对方的回复
 char p;
 SOCKET sMe, sPeer;
 int ret;
 int dwSenderSize;
 sockaddr_in MeAddr, PeerAddr;
 int iPort = DEFAULT_PORT;
 int dwLength = DEFAULT_BUFFER;
 sendBuff = new char[DEFAULT_BUFFER];//不能太小。一般大于256 
 //创建服务器管套
 sMe = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
 if (sMe == SOCKET_ERROR)
 {
  printf("创建管套失败!\n");
  return;
 }
 //设置接自己的地址,端口号和地址族。这里主要是端口号。
 MeAddr.sin_family = AF_INET;
 MeAddr.sin_port = htons((short)(iPort + 1));
 MeAddr.sin_addr.s_addr = inet_addr(GetIP());//
 //MeAddr.sin_addr.s_addr = htonl(INADDR_ANY);
 ret = bind(sMe, (SOCKADDR *)&MeAddr, sizeof(MeAddr));
 if (ret == SOCKET_ERROR)
 {
  printf("发送的BIND失败!\n");
  return;
 }
 //设置对方的地址。发送必须知道对方
 PeerAddr.sin_family = AF_INET;
 PeerAddr.sin_port = htons(iPort);
 PeerAddr.sin_addr.S_un.S_addr = inet_addr("192.168.137.1");
 if (PeerAddr.sin_addr.S_un.S_addr == INADDR_NONE)
 {
  printf("对方地址无效!\n");
  return;
 }
 while (1)
 {
  dwSenderSize = sizeof(PeerAddr);
  //使用sServer套接字向客户发送应答信息
  printf("\n我:");
  memset(sendBuff, 0, dwLength);
  gets(sendBuff);
  ret = sendto(sMe, sendBuff, strlen(sendBuff), 0,
   (SOCKADDR *)&PeerAddr, dwSenderSize);
  if (ret == SOCKET_ERROR)
  {
   printf("发送信息失败!\n");
  }
 }
 closesocket(sMe);
 delete sendBuff;
}
---------------------------Main函数。--------------------------------
// UDPServer.cpp : Defines the entry point for the console application.
//
#include"Server.h"
#include<stdio.h>
#include <WinSock2.h>
#include <iostream>
#include<Thread>
#pragma comment(lib,"ws2_32.lib")   //静态加入一个lib文件
int main(int argc, char* argv[])
{
 WSADATA wsd;
 //初始化Winsock
 if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
 {
  printf("装载Winsock失败!\n");
  return 1;
 }
 int a(1);
 std::thread thread_send(fun_send,a);
 ////////////////////////////
 Server1();
 ////////////////////////////
 WSACleanup();
 system("pause");
 return 0;
}

3、需要注意的是

由于没有服务器,当然两个电脑,必须在同一局域网下,并记得更改程序中的IP地址。
程序是P2P的方式,所以双方IP地址都得设置。
另外,程序中部分函数采用的是老版本的函数,所以可能会出危险提醒,请百度解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值