window上用c/c++实现socket udp编程

14 篇文章 0 订阅

服务端

如果对socket()、bind()函数不理解,请看另一篇博文:

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


int main() {
	WSADATA ws;
	WSAStartup(MAKEWORD(2, 2), &ws);

	int server = socket(AF_INET, SOCK_DGRAM, 0);

	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_addr.S_un.S_addr = 0;
	addr.sin_port = htons(8080);

	int bindRet = bind(server, (sockaddr*)& addr, sizeof(addr));
	if (bindRet == -1) {
		cout << "绑定端口失败,或许端口已经被占用" << errno << endl;
		exit(0);
	}

	cout << "udp服务启动,正确8080端口监听" << endl;

	while (true) {
		char buf[100];
		int len = 666;
		/*
		  int fd             : 套接字描述符
		  char* buf          : 缓冲区
		  int bufSize        : 缓冲区大小
		  int flags          : 给0就可以了
		  sockaddr* addr     : 用来保存接收到的地址
		  int* addrLen       : 用来保存前一个参数的长度
		  成功返回实际接收的字节数
		  失败返回-1
		*/
		int recvRet = recvfrom(server, buf, sizeof(buf), 0, (sockaddr*)& addr, &len);

		if (recvRet == -1) {
			cout << "接收失败:" << errno << endl;
			break;
		}

		cout << "收到:" << buf << endl;

		strcpy(buf, "你好客户端");

		/*
		  int fd              : 套接字描述符
		  const char* msg     : 消息缓冲区---即要发送的消息
		  int msgSize         : 消息缓冲区大小
		  int flags           : 给0就可以了
		  sockaddr* addr      : 用来指定要发送的目标ip和端口号
		  int addrLen         : 用来指定前一个参数的长度
		  成功返回已经发送的字节数
		  失败返回-1
		*/
		int sendRet = sendto(server, buf, sizeof(buf), 0, (sockaddr*)& addr, sizeof(addr));
		if (sendRet == -1) {
			cout << "发送失败" << errno << endl;
			break;
		}
	}
	

	cout << "服务运行结束:" << errno << endl;
}

客户端

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


int main() {
	WSADATA ws;
	WSAStartup(MAKEWORD(2, 2), &ws);

	int client = socket(AF_INET, SOCK_DGRAM, 0);

	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	addr.sin_port = htons(8080);

	char buf[100] = "你好服务器";

	int sendRet = sendto(client, buf, sizeof(buf), 0, (sockaddr*)& addr, sizeof(addr));
	if (sendRet == -1) {
		cout << "发送失败:" << errno << endl;
		exit(0);
	}

	int len = 666;
	int recvRet = recvfrom(client, buf, sizeof(buf), 0, (sockaddr*)& addr, &len);
	if (recvRet == -1) {
		cout << "接收失败" << errno << endl;
		exit(0);
	}

	cout << "收到:" << buf << endl;

}

运行截图

在这里插入图片描述

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C/C++实现理想低通滤波器通常涉及数字信号处理,特别是在处理离散时间信号时。理想低通滤波器是一个数学模型,它允许通过频率低于截止频率的信号,并完全阻止高于截止频率的信号。这种滤波器在频域上表现为一个平坦的响应(零阶保持),而在时域上则有无限的阶跃响应。 对于简单的一维理想低通滤波,常常使用窗函数(如汉明窗、矩形窗等)近似实现,因为理想滤波器无法通过离散傅立叶变换(DFT)直接计算。这里是一个基本的近似的离散卷积代码示例,使用了C语言: ```c #include <stdio.h> #include <stdlib.h> // 矩形窗函数,理想低通滤波的一个简化版本 int window_function(int x, int size) { return (size / 2 <= x && x < size - (size / 2)); } // 离散卷积函数,用于模拟滤波过程 void ideal_lowpass_filter(int* input, int* output, int input_len, int filter_len) { for (int i = 0; i < input_len; ++i) { int sum = 0; for (int j = 0; j < filter_len; ++j) { if (window_function(i-j, filter_len)) sum += input[j]; } output[i] = sum; } } int main() { // 示例输入和过滤器长度 int input[] = {1, 2, 3, 4, 5, 6, 7, 8}; int output[input_len]; int filter_len = 3; ideal_lowpass_filter(input, output, sizeof(input) / sizeof(input[0]), filter_len); // 输出滤波结果 for (int i = 0; i < input_len; ++i) printf("%d ", output[i]); return 0; } ``` 这只是一个非常基础的例子,实际应用中可能需要调整窗口大小和优化算法性能。同时,理想低通滤波器在实时处理大型数据集时可能会遇到内存限制。请注意,真正的理想低通滤波在离散世界是不可能实现的,这是理论上的概念。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值