TCP收发信息(C++)

目录

一、介绍

二、收数据

三、发数据


 

一、介绍

tcp和udp的区别之一,即tcp是有连接的,udp是无连接的,udp收发数据的代码可以独立运行,tcp发数据前必须确保收数据的一方是打开的,否则无法建立连接。

二、收数据

tcpRecv.h

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

class tcpRecv
{
public:
	tcpRecv();
	~tcpRecv();
	void initialization();
	void recvData();
public:
	//定义发送缓冲区和接受缓冲区
	char send_buf[100];
	char recv_buf[100];
	//定义服务端套接字,接受请求套接字
	SOCKET s_server;
	SOCKET s_accept;
	//服务端地址客户端地址
	SOCKADDR_IN server_addr;
	SOCKADDR_IN accept_addr;
};

 tcpRecv.cpp

#include "tcpRecv.h"

tcpRecv::tcpRecv()
{
	initialization();
	//填充服务端信息
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	server_addr.sin_port = htons(14555);
	//创建套接字
	s_server = socket(AF_INET, SOCK_STREAM, 0);
	if (bind(s_server, (SOCKADDR *)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
		cout << "套接字绑定失败!" << endl;
		WSACleanup();
	}
	else {
		cout << "套接字绑定成功!" << endl;
	}
	//设置套接字为监听状态
	if (listen(s_server, SOMAXCONN) < 0) {
		cout << "设置监听状态失败!" << endl;
		WSACleanup();
	}
	else {
		cout << "设置监听状态成功!" << endl;
	}
	cout << "服务端正在监听连接,请稍候...." << endl;
	//接受连接请求
	int len = sizeof(SOCKADDR);
	s_accept = accept(s_server, (SOCKADDR *)&accept_addr, &len);
	if (s_accept == SOCKET_ERROR) {
		cout << "连接失败!" << endl;
		WSACleanup();
	}
	cout << "连接建立,准备接受数据" << endl;
}


tcpRecv::~tcpRecv()
{
	//关闭套接字
	closesocket(s_server);
	closesocket(s_accept);
	//释放DLL资源
	WSACleanup();
}


void tcpRecv::initialization() {
	//初始化套接字库
	WORD w_req = MAKEWORD(2, 2);//版本号
	WSADATA wsadata;
	int err;
	err = WSAStartup(w_req, &wsadata);
	if (err != 0) {
		cout << "初始化套接字库失败!" << endl;
	}
	else {
		cout << "初始化套接字库成功!" << endl;
	}
	//检测版本号
	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
		cout << "套接字库版本号不符!" << endl;
		WSACleanup();
	}
	else {
		cout << "套接字库版本正确!" << endl;
	}
	//填充服务端地址信息

}

void tcpRecv::recvData() {
	//接收数据
	int recv_len = recv(s_accept, recv_buf, 100, 0);
	if (recv_len < 0) {
		cout << "接受失败!" << endl;
	}
	else {
		cout << "接收信息为:" << recv_buf << endl;
	}
}

 main.cpp

#include "tcpRecv.h"

int main() {
	tcpRecv tcp;
	while (1) {
		tcp.recvData();
	}
	return 0;
}

三、发数据

tcpSend.h

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

class tcpSend
{
public:
	tcpSend();
	~tcpSend();
	void initialization();
	void sendData(std::string&data);
public:
	//定义服务端套接字,接受请求套接字
	SOCKET s_server;
	//服务端地址客户端地址
	SOCKADDR_IN server_addr;
};

 tcpSend.cpp

#include "tcpSend.h"

tcpSend::tcpSend()
{
	initialization();
	//填充服务端信息
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	server_addr.sin_port = htons(14555);
	//创建套接字
	s_server = socket(AF_INET, SOCK_STREAM, 0);
	if (connect(s_server, (SOCKADDR *)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
		cout << "服务器连接失败!" << endl;
		WSACleanup();
	}
	else {
		cout << "服务器连接成功!" << endl;
	}
}


tcpSend::~tcpSend()
{
	//关闭套接字
	closesocket(s_server);
	//释放DLL资源
	WSACleanup();
}

void tcpSend::initialization() {
	//初始化套接字库
	WORD w_req = MAKEWORD(2, 2);//版本号
	WSADATA wsadata;
	int err;
	err = WSAStartup(w_req, &wsadata);
	if (err != 0) {
		cout << "初始化套接字库失败!" << endl;
	}
	else {
		cout << "初始化套接字库成功!" << endl;
	}
	//检测版本号
	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
		cout << "套接字库版本号不符!" << endl;
		WSACleanup();
	}
	else {
		cout << "套接字库版本正确!" << endl;
	}
	//填充服务端地址信息

}

void tcpSend::sendData(std::string&data) {
	int send_len = send(s_server, data.c_str(), sizeof(data), 0);
	if (send_len < 0) {
		cout << "发送失败!" << endl;
	}
	else {
		std::cout << "send data:" << data.c_str() << std::endl;
	}

}

 main.cpp

#include "tcpSend.h"

int main() {
	tcpSend tcp;
	for (int i = 0; i < 100; i++) {
		std::string s = "test " + std::to_string(i);
		tcp.sendData(s);
		Sleep(1000);
	}
	return 0;
}

 

你可以使用TCP协议在网络上收发点云数据。点云数据通常以二进制形式表示,可以通过TCP套接字在客户端和服务器之间进行传输。以下是一个基本的示例代码,展示了如何使用C语言实现TCP收发点云数据: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #define MAX_BUFFER_SIZE 1024 void error(const char *msg) { perror(msg); exit(1); } int main() { int socket_fd, client_fd; struct sockaddr_in server_addr, client_addr; socklen_t client_len; // 创建套接字 socket_fd = socket(AF_INET, SOCK_STREAM, 0); if (socket_fd < 0) { error("无法创建套接字"); } // 设置服务器地址 memset((char *)&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(12345); // 设置端口号 // 绑定套接字到服务器地址 if (bind(socket_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { error("绑定套接字失败"); } // 监听连接请求 listen(socket_fd, 5); printf("等待客户端连接...\n"); client_len = sizeof(client_addr); // 接受客户端连接 client_fd = accept(socket_fd, (struct sockaddr *)&client_addr, &client_len); if (client_fd < 0) { error("无法接受客户端连接"); } printf("客户端已连接\n"); // 接收点云数据 char buffer[MAX_BUFFER_SIZE]; memset(buffer, 0, sizeof(buffer)); int bytes_received = recv(client_fd, buffer, sizeof(buffer) - 1, 0); if (bytes_received < 0) { error("接收数据失败"); } printf("接收到的点云数据: %s\n", buffer); // 发送点云数据 const char *point_cloud_data = "这是一个点云数据"; int bytes_sent = send(client_fd, point_cloud_data, strlen(point_cloud_data), 0); if (bytes_sent < 0) { error("发送数据失败"); } // 关闭套接字 close(client_fd); close(socket_fd); return 0; } ``` 上述代码创建了一个TCP服务器,它在端口12345上监听客户端连接。当客户端连接后,服务器会接收点云数据,并发送回一个确认消息。 请注意,上述代码仅为示例,您可能需要根据您的具体需求进行修改和优化。例如,您可能需要设计更复杂的协议来传输点云数据,以便能够正确解析和处理数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aspiretop

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值