网络编程~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;
}

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

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
目录 (1)基本网络编程实例 Winsock实现网络聊天室【\chap1\ChatRoom(Winsock)】 CSocket实现聊天室【\chap1\ChatRoom(Csocket)】 (2)本地计算机网络编程实例 获取计算机的名称和IP地址【\chap2\Local】 获取计算机的子网掩码【\chap2\ Local】 获取计算机的DNS设置【\chap2\ Local】 获取计算机的网卡地址【\chap2\ Local】 获取计算机安装的协议【\chap2\ Local】 获取计算机提供的服务【\chap2\ Local】 获取计算机的所有网络资源【\chap2\ Local】 修改本地计算机的所有网络设置【\chap2\ Local】 获取计算机TCP/IP协议的所有信息【\chap2\ Local】 (3)局域网网络通信编程实例 获取网上邻居【\chap3\Neighbor】 lIP地址和计算机名之间的转换【\chap3\Neighbor】 l映射网络驱动器【\chap3\Neighbor】 l消息发送程序Net Send【\chap3\Neighbor】 l获取局域网内其他计算机的信息【\chap3\ NeighborInfo】 (4)IE编程实例 简单的浏览器的实现【\chap4\MyBrowser】 删除IE相关历史记录【\chap4\DelHistory】 将应用程序加入到IE工具栏【\chap4\AddToToolBar】 超级链接的实现【\chap4\HyperLink】 禁止IE的弹出窗口【\chap4\StopPopup】 禁止浏览某些网站【\chap4\StopTravel】 IE收藏夹【\chap4\ MyBrowser】 创建桌面快捷方式和活动桌面【\chap4\ShortCut】 (5)基本网络编程实例 点对点文件传输【\chap5\Transfer】 大型文件传输【\chap5\Transfer】 端口扫描程序【\chap5\ MyPortScanner】 Finger编程【\chap5\MyFinger】 Sniff编程【\chap5\MySniff】 Internet文件下载【\chap5\ InternetDownload】 (6)网络通信协议编程 FTP协议【\chap6\FTP】 Email协议【\chap6\Email】 ICMP协议【\chap6\ICMP】 RAS协议【\chap6\RAS】 TAPI协议【\chap6\TAPI】 Telnet协议【\chap6\Telnet】 HTTP协议 【\chap6\HTTP】 (7)Modem /串口通信编程 Modem编程【\chap7\Modem】 MSCOMM控件编程【\chap7\MSCOMM】 串口通信API编程【\chap7\MySerialCom】 (8)代理服务器编程实例 Socks 5协议编程【\chap8\Socks5】 HTTP代理服务器【\chap8\HTTP代理服务】 (9)高级网络通信编程实例 串口通信编程实例【\chap9\SerialPort】 网络流量监控【\chap9\NetTraffic】 网站下载【\chap9\ Snag】 网络五子棋系统【\chap9\FiveChess】 语音聊天【\chap9\ ChatRoom】 远程监控【\chap9\RemoteControl】 赠送实例 类似网络蚂蚁的断点续传程序【\Appendix\NetAnts】 网络多播程序【\Appendix\BroadCast】 界面美观的文字聊天程序【\Appendix\Chat】 语音电话【\Appendix\PhoneCall】

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值