您现在的位置是:首页 >技术交流 >VS、C++、TCPIP通讯 网站首页技术交流

VS、C++、TCPIP通讯

梦幻Mew 2025-02-10 10:02:31
简介VS、C++、TCPIP通讯

目录

前言

一、VS属性设置

二、c++文件

tcpSocket.h

 tcpSocket.cpp

server.cpp

 client.cpp

总结


前言

用于TCPIP通讯的代码,避免遗忘,做了注释


一、VS属性设置

vs属性页 → C/C++ → 常规 → SDL检查选择 “否(/sdl-)”

vs属性页 → C/C++ → 预处理器 → 预处理器定义,添加WIN32_LEAN_AND_MEAN

 按以下顺序进行包含,可以避免重复包含的冲突

#include "WinSock2.h"
#include "windows.h"
#include "stdafx.h"

二、c++文件

tcpSocket.h

#ifndef _TCPSOCKET_H_
#define _TCPSOCKET_H_
#include<WinSock2.h>				// windows平台的网络库头文件
#pragma comment(lib,"ws2_32.lib")	// 库文件
#include <stdbool.h>				// bool类型
#include <stdio.h>

#define PORT 502	// [0,65536) 0~1024是保留端口
#define err(errMsg) printf("[line:%d]%s failed code %d",__LINE__, errMsg, WSAGetLastError())

// 打开网络库
bool init_Socket();

// 关闭网络库
bool close_Socket();

// 创建服务器socket
SOCKET createServerSocket();

// 创建客户端socket
SOCKET createClientSocket(const char* ip);

#endif // !_TCPSOCKET_H_

 tcpSocket.cpp

#include "tcpSocket.h"

bool init_Socket()
{
	// windows socket async,windows异步套接字
	// 参数1:请求的socket版本,如2.2 2.1 1.0
	// 参数2:传出参数
	WSADATA wsadata;
	if (0 != WSAStartup(MAKEWORD(2, 2), &wsadata))
	{
		printf("WSAStartup failed code %d", WSAGetLastError());
		return false;
	}
	return true;
}

bool close_Socket()
{
	if (0 != WSACleanup())
	{
		printf("WSACleanup failed code %d", WSAGetLastError());
		return false;
	}
	return true;
}

SOCKET createServerSocket()
{
	// 1、创建空的Socket
	// 参数1:sf 地址协议族 ipv4 ipv6
	// 参数2:type 传输协议类型 流式套接字 数据包
	// 参数3:protocl 使用具体的某个传输协议
	SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (fd == INVALID_SOCKET)		// 查看socket是否创建成功
	{
		err("socket");
		return INVALID_SOCKET;
	}

	// 2、给socket绑定ip地址和端口号
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;			// 和创建socket时的必须一样
	addr.sin_port = htons(PORT);		// 大端存储和小端存储
	addr.sin_addr.S_un.S_addr = ADDR_ANY; // inet_addr("127.0.0.1");ADDR_ANY绑定本机任意网卡的任意IP

	if (SOCKET_ERROR == bind(fd, (const sockaddr*) & addr, sizeof(addr)))
	{
		err("bind");
		return false;
	}

	// 3、监听电话
	listen(fd, 10);

	return fd;
}

SOCKET createClientSocket(const char* ip)
{
	// 1、创建空的Socket
	// 参数1:sf 地址协议族 ipv4 ipv6
	// 参数2:type 传输协议类型 流式套接字 数据包
	// 参数3:protocl 使用具体的某个传输协议
	SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (fd == INVALID_SOCKET)		// 查看socket是否创建成功
	{
		err("socket");
		return INVALID_SOCKET;
	}

	// 2、与服务器建立连接
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;							// 和创建socket时的必须一样
	addr.sin_port = htons(PORT);						// 大端存储和小端存储
	addr.sin_addr.S_un.S_addr = inet_addr(ip);	// ADDR_ANY绑定本机任意网卡的任意IP
	if (INVALID_SOCKET == connect(fd, (struct sockaddr*)&addr, sizeof(addr)))
	{
		err("connect");
		return false;
	}

	return fd;
}

server.cpp

#include "../tcpSocket/tcpSocket.h"  // 选择合适路径

int main()
{
	init_Socket();

	SOCKET serfd = createServerSocket();
	printf("wait client connect...
");

	// 如果有客户端请求连接
	SOCKET clifd = accept(serfd, NULL, NULL);
	if (INVALID_SOCKET == clifd)	// 如果失败
	{
		err("accept");
	}

	//可以和客户端进行通信了
	char sendbuf[BUFSIZ] = { 0 };
	char recvbuf[BUFSIZ] = { 0 };
	while (true)
	{
		// recv从指定的socket接收消息
		if (0 < recv(clifd, recvbuf, BUFSIZ, 0))
		{
			printf("recv:%s
", recvbuf);
			memset(recvbuf, 0, sizeof(recvbuf));
		}

		// 发送消息
		printf("send>");
		memset(sendbuf, 0, sizeof(sendbuf));
		gets_s(sendbuf, BUFSIZ);
		if (SOCKET_ERROR == send(clifd, sendbuf, strlen(sendbuf), 0))
		{
			err("send");
		}
	}

	// 关闭
	closesocket(clifd);
	closesocket(serfd);
	close_Socket();
	printf("server----------end----------
");
	getchar();
	return 0;
}

 client.cpp

#include "../tcpSocket/tcpSocket.h"  // 选择合适路径

int main()
{
	init_Socket();
	SOCKET fd = createClientSocket("127.0.0.1"); // 本机测试地址

	char sendbuf[BUFSIZ] = { 0 };
	char recvbuf[BUFSIZ] = { 0 };

	while (true)
	{
		// 发送消息
		printf("send>");
		memset(sendbuf, 0, sizeof(sendbuf));
		gets_s(sendbuf, BUFSIZ);
		if (SOCKET_ERROR == send(fd, sendbuf, strlen(sendbuf), 0))
		{
			err("send");
		}

		// recv从指定的socket接收消息
		if (0 < recv(fd, recvbuf, BUFSIZ, 0))
		{
			printf("recv:%s
", recvbuf);
			memset(recvbuf, 0, sizeof(recvbuf));
		}


	}

	// 关闭
	closesocket(fd);
	close_Socket();
	printf("client----------end----------
");
	getchar();
	return 0;
}

总结

在VS平台上,用于TCPIP通讯的C++代码

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。