网络编程~C++实现局域网通信

  最近在学网络编程,学习了UDP的通信原理。写了基于UDP的服务端和客户端,可以实现局域网直接的通信,可以实现一个服务端,对多个客户端,试验过两个客户端的,两个客户端可以接收到服务端的消息,两个客户端的消息服务端也可以收到,两个客户端之间无法通信。在接收方面,可能会出现接收混乱,因为是接收一句,发送一句。

 下面是服务端的代码,是在控制台上实现的.

#include <iostream>
#include <winsock2.h>
using namespace std;
#pragma comment(lib, "ws2_32.lib")//连接库

int main()
{//创建套接字,相当于句柄
	WORD Version;
	WSADATA wData;
	Version = MAKEWORD(2, 2);
	int n = WSAStartup(Version, &wData);
	if(n != 0)//检查是否出错,不过一般不会出错的
	{
		cout << "Error!" << endl;
		return -1;
	}
	SOCKET soc = socket(AF_INET, SOCK_DGRAM, 0);
	if(INVALID_SOCKET == soc)
	{
		cout << "Error!" << endl;
		return -1;
	}
	//创建端口
	sockaddr_in addSer;
	addSer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addSer.sin_family = AF_INET;
	addSer.sin_port = htons(8008);   //端口随便,端口号的有效范围是从0到65535。
	n = bind(soc, (sockaddr*)&addSer, sizeof(addSer));   //一般来说,大于49151的端口号都代表动态端口。绑定套接字
	if(n == SOCKET_ERROR)    //出错检查,出错,可能端口被占用了,需要换一个
	{
		cout << "Error!" << endl;
		return -1;
	}
	char Send[256];        //发送字符串
	char Rev[256];         //接收字符串
	sockaddr_in addClient;  //接收方的地址信息结构体
	int len = sizeof(sockaddr);
	while(1)
	{
		int i = recvfrom(soc, Rev, 256, 0, (sockaddr*)&addClient, &len); //接受,阻塞在这,直到接收到信息
		Rev[i] = '\0';
		if(Rev[0] == 'Q')
		{
			cout << "Char end!" << endl;
			break;
		}
		cout << inet_ntoa(addClient.sin_addr) << " say :" << Rev << endl;  //输出发送方的IP,和信息
		cout << "Please say something : ";
		gets(Send);
		sendto(soc, Send, strlen(Send), 0, (sockaddr *)&addClient, len);    //发送消息
	}
	closesocket(soc);      //关闭套接字
	WSACleanup();
	return 0;
}

下面的是客户端的代码:

#include <iostream>
#include <winsock2.h>
using namespace std;
#pragma comment(lib, "ws2_32.lib")

int main()
{//创建套接字,跟服务端的差不多
	WORD Version;
	WSADATA wData;
	Version = MAKEWORD(2, 2);
	int n = WSAStartup(Version, &wData);
	if(n != 0)
	{
		cout << "Error!" << endl;
		return -1;
	}
	SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);
	if(INVALID_SOCKET == sockClient)
	{
		cout << "Error!" << endl;
		return -1;
	}
	sockaddr_in addser;//不同在这里,需要服务端的IP,端口
	addser.sin_addr.S_un.S_addr = inet_addr("192.168.1.100");
	addser.sin_family = AF_INET;
	addser.sin_port = htons(8008);
	char Send[256];    //发送的消息
	char Rev[256];     //接收的消息
	int len = sizeof(sockaddr);

	while(1)
	{
		cout << "Please say something : ";
		gets(Send);
		sendto(sockClient, Send, strlen(Send), 0, (sockaddr*)&addser, len);   //发送
		int i = recvfrom(sockClient, Rev, 256, 0, (sockaddr*)&addser, &len);  //结束,阻塞在这
		Rev[i] = '\0';//直到接收到
		if(i == -1)
			cout << "服务端未开启!" << endl;
		else
		{
			if(Rev[0] == 'Q')
			{
				cout << "Char end!" << endl;
				break;
			}
			cout << inet_ntoa(addser.sin_addr) << " say : " << Rev << endl;       //输出发送方的IP和消息
		}
	}
	closesocket(sockClient);   //关闭套接字
	WSACleanup();
	return 0;
}

测试的实例就不贴出来了,局域网的其他人说话不是很好!~~~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值