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地址都得设置。
另外,程序中部分函数采用的是老版本的函数,所以可能会出危险提醒,请百度解决。