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

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

时间: 2024-08-24 05:00:08

网络编程~C++实现局域网通信的相关文章

Qt学习心得之网络编程简单的局域网聊天服务端建立

学而不思则罔,思而不学则殆.学习和思考是相辅相成的,通过这几天对网络编程的学习,收获颇丰.接下来我将利用Qt做的一个以TcpIp协议为传输方式的简单的局域网聊天服务端与大家分享下: 首先谈谈我个人对Tcp协议的理解:Tcp就是网上购物,买家和买家之间的物品传递,快递公司的扮演.快递公司将卖家所要寄出的物品进行包装,给予独特的号码,并从卖家获取目的地地址,得知这些明确信息后准确将物品送到买家,买家签收后,卖家通过快递单号查询到买家签收的消息. 其次是这个简单局域网聊天服务器的创建思路.如下图是思路

Unity3d网络编程_多机通信一些问题

网上一些网络教程脚本其实多数是正确的,不过IP地址那部分多数都会写成“127.0.0.1”本地IP. 这样会让你在自己机子上开两个案例运行,两者通信是完全没问题,一旦是两台设备就会出现连接不上. 这也是很明显的,IP监听是监听本地IP,离开本机自然也连接不上. 方法很简单,服务器端把IP监听对上号,要么就直接监听Any,这样再锁定端口就可以在不同设备通信了. System.Net.IPAddress localAdd = System.Net.IPAddress.Any;

网络编程-socket实现循环通信

server import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bind(('127.0.0.1',8080)) phone.listen(5) conn,client_addr=phone.accept() print(client_addr) #通信循环 while True: data=conn.recv(1024) print("Client data:",data) conn.

网络编程(三)——通信循环、链接循环、粘包问题

通信循环.链接循环.粘包问题 一.通信循环 服务端和客户端可以进行连续的信息交流 from socket import * ser_socket = socket(AF_INET, SOCK_STREAM) ser_socket.bind(('127.0.0.1', 8886)) ser_socket.listen(5) conn, addr = ser_socket.accept() while True: try: # 抛出异常,若不抛出处理,一旦客户端强行退出,服务端就会报错 data =

Linux网络编程——TCP和UDP通信

TCP协议流程图.TCP建立即时聊天 TCP即时聊天升级:服务器在客户端断开后不断开,客户端可以多次重连服务器进行即时聊天 UDP协议流程图.UDP建立即时连接 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)需调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket,但也可以直接用setsockopt和reuse. SO_RCVLOWAT设置接收缓冲区下限 1.TCP协议的流程图 服务端:socket---bi

Java网络编程 探险

我们先来看看计算机网络主要功能:资源共享:信息传输和集中处理:负载均衡和分布处理:综合信息服务. 实际上Java的网络编程就是服务器通过ServerSocket建立监听,客户端通过Socket连接到指定服务器后,通信双方就可以通过IO流进行通信了. 1.认识网络编程 计算机网络中实现通信的约定被称为通信协议,通信协议负责对传输速率.传输代码.代码结构.传输控制步骤.出错控制等制定处理标准. 计算机网络的OSI模型(各种计算机网络的参考标准)如下: 1)上层协议 http,ftp,https 2)

Python网络编程02/基于TCP协议的socket简单的通信

目录 Python网络编程02/基于TCP协议的socket简单的通信 1.昨日内容回顾 2.socket 2.1 socket套接字 2.2 基于TCP协议的socket简单通信 Python网络编程02/基于TCP协议的socket简单的通信 1.昨日内容回顾 1.单播:单独联系某一个人 2.广播:给所有人发送消息(群发) 3.比特流:bit就是0101跟水流一样的源源不断的发送01010101 4.以太网协议:将数据进行分组:一组称之为一帧,数据报 head|data head:18字节:

Winpcap网络编程十之Winpcap实战,两台主机通过中间主机通信

注:本篇博客同样不针对于伸手党,源代码等等的我不会完全公开的,此篇文章写出来为大家的网络编程或者课程设计提供一定的思路.. 好,本次我们需要完成的任务是: 完成两台主机通过中间主机的数据通信(网络层) 增加基于IP地址的转发功能 增加网络层封装 其实最主要的就是基于IP地址的转发功能,网络层的封装其实我们在初级功能中就已经做好了. 首先,实验的思路是A通过中间主机B向C发送数据.那么B则作为一个路由器,B要监听两个网卡,一个网卡发来的数据通过另一个网卡发出去. 示意图如下: A---------

[C# 网络编程系列]专题九:实现类似QQ的即时通信程序

转自:http://www.cnblogs.com/zhili/archive/2012/09/23/2666987.html 引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例来让大家更好的理解它们的工作原理以及怎样.Net类库去实现它们的.为了让大家更好的理解我们平常中常见的软件QQ的工作原理,所以在本专题中将利用前面专题介绍的知识来实现一个类似QQ的聊天程序. 一.即时通信系统 在我们的生活中经常使用即时通信的软件,我们经常接触到的有:QQ.阿里旺旺.MSN等等.这些