Socket实现双机通信

这篇具有很好参考价值的文章主要介绍了Socket实现双机通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用软件:Visual Studio 2022

步骤:
1,新建一个空项目,项目名称为Server,解决方案名称为Socket;

2,软件右方解决方案资源管理器中->右击"解决方案"Socket"->添加"新建项目"添加空项目,项目名称为Client;

3,右击"Server"->添加“现有项”,"Server"有一个头文件,一个源文件,多选并添加。"Client"同理;
特别注意:
          ①Server.h,Server.c属于项目"Server";Client.h,Client.c属于项目"Client";
          ②Server.c和Client.c中第一行对头文件的引用,/Socket为头文件位置,请做出相应更改;
          ③右击项目Client->项目->属性->C/C++->常规->SDL检查改为否,不做修的话"inet_addr"会出错。

4,按ctrl+F5先运行Server,再右击"Client"->调试->启动新实例;

5,开始运行。(注意:客户端输入"end"结束连接,连接断开后服务器端再次发送消息不成功,会再次进入监听状态)

服务器端头文件Server.h

#ifndef _SOCKETTCP_H_
#define _SOCKETTCP_H_
#include<WinSock2.h>  //Windows平台网络库头文件
#pragma comment(lib,"ws2_32.lib") //库文件
#include<stdbool.h>
#include<stdio.h>
#define PORT 8888 //端口号  >1024
#define err(errMsg) printf("[line:%d]%s failed code %d",__LINE__,errMsg,WSAGetLastError())

//打开网络库
bool init_Socket();
//关闭网络库
bool close_Socket();
//创建服务端
SOCKET CreateServerSocket();
#endif // ! _SOCKETTCP_H_

服务器端源文件Server.c

#include"../Socket/Server.h"
#include<stdio.h>
#include<stdlib.h>
int main()
{

	init_Socket();
	SOCKET serfd = CreateServerSocket();
	
	Sign:printf("IP:127.0.0.1\n");
	printf("Listening port:%d \n", PORT);
	printf("wait Client connect...\n");

	//客户端请求连接
	SOCKET clifd = accept(serfd, NULL, NULL);
	if (INVALID_SOCKET == clifd)
	{
		err("accept");
	}
	//可以与客户端通信


	char recvbuf[BUFSIZ] = { 0 };
	char sendbuf[BUFSIZ] = { 0 };
	printf("Client connected...\n");

	while (true)
	{
		//接收消息
		if (0 < recv(clifd, recvbuf, BUFSIZ, 0))
		{
			printf("recv:%s\n", recvbuf);
			memset(recvbuf, 0, sizeof(recvbuf));

		}


		//给客户端发送消息
		printf("send>");
		gets_s(sendbuf, BUFSIZ);

			

		if (SOCKET_ERROR == send(clifd, sendbuf, strlen(sendbuf), 0))
		{
			err("send");
			printf("\n");
			printf("Client disconnected\n");
			goto Sign;
		}

		if (INVALID_SOCKET == clifd)
		{
			err("accept");
			return false;
		}


	}
	closesocket(clifd);
	closesocket(serfd);
	close_Socket();
	system("pause");

	return 0;
	
}




bool init_Socket()
{
	WSADATA wsadata;
	if(0 != WSAStartup(MAKEWORD(2, 2), &wsadata))
	{
		printf("WSAStartup failed code %d", WSAGetLastError());
		return false;
	}
	//WSA   Windows异步套接字
    //parm1 请求的Socket版本
    //parm2 传出参数
	return true;
}

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





SOCKET CreateServerSocket()
{
	//1  创建空的Socket
	//af 地址协议族
	//type 传输协议类型: 流式套接字 数据报套接字
	//protocol 使用的具体传输协议
	SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (fd == INVALID_SOCKET)
	{
		err("socket");
		return INVALID_SOCKET;
	}


	//2 绑定端口与ip地址
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);
	addr.sin_addr.S_un.S_addr =ADDR_ANY;
	if (SOCKET_ERROR == bind(fd, &addr, sizeof(addr)))
	{
		err("bind");
		return false;
	}
	//监听
	listen(fd, 10);
	
	return fd;
	
}

客户端头文件Client.h

#ifndef _SOCKETTCP_H_
#define _SOCKETTCP_H_
#include<WinSock2.h>  //Windows平台网络库头文件
#pragma comment(lib,"ws2_32.lib") //库文件
#include<stdbool.h>
#include<stdio.h>
#define PORT 8888 //端口号  >1024
#define err(errMsg) printf("[line:%d]%s failed code %d",__LINE__,errMsg,WSAGetLastError())

//打开网络库
bool init_Socket();
//关闭网络库
bool close_Socket();
//创建客户端
SOCKET CreateClientSocket(const char *ip);
#endif // ! _SOCKETTCP_H_

客户端源文件Client.c文章来源地址https://www.toymoban.com/news/detail-502517.html

#include"../Socket/Client.h"
#include<stdio.h>
#include<stdlib.h>
int main()
{

	init_Socket();
	SOCKET fd = CreateClientSocket("127.0.0.1");
	printf("Server connected...\n");
	printf("tip:Enter 'end' to end the connection\n");
	
	//发送消息
	char recvbuf[BUFSIZ] = { 0 };
	char sendbuf[BUFSIZ] = { 0 };
	char endbuf[BUFSIZ] = {"end"};
	while (true)
	{
		//发送消息
		printf("send>");
		gets_s(sendbuf, BUFSIZ);

		//输入'end'断开连接
		if (strcmp(sendbuf,endbuf)== 0)
		{
			return false;
		}
		if (SOCKET_ERROR == send(fd, sendbuf, strlen(sendbuf), 0))
		{
			err("send");
		}
		
		//接收消息
		if (0 < recv(fd, recvbuf, BUFSIZ, 0))
		{
			
			printf("recv:%s\n", recvbuf);
			memset(recvbuf, 0, sizeof(recvbuf));
			
		}
		
		
	}
		

	
	closesocket(fd);
	close_Socket();
	
	system("pause");
	

	return 0;
}




bool init_Socket()
{
	WSADATA wsadata;
	if (0 != WSAStartup(MAKEWORD(2, 2), &wsadata))
	{
		printf("WSAStartup failed code %d", WSAGetLastError());
		return false;
	}
	//WSA   Windows异步套接字
	//parm1 请求的Socket版本
	//parm2 传出参数
	return true;
}

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





SOCKET CreateClientSocket(const char *ip)
{
	//1  创建空的Socket
	//af 地址协议族
	//type 传输协议类型: 流式套接字 数据报套接字
	//protocol 使用的具体传输协议
	SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (fd == INVALID_SOCKET)
	{
		err("socket");
		return INVALID_SOCKET;
	}


	//2 与服务器建立连接
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);
	addr.sin_addr.S_un.S_addr =inet_addr(ip);
	if (INVALID_SOCKET == connect(fd, (struct sockaddr*)&addr, sizeof(addr)))
	{
		err("connect");
		return false;
	}

	return fd;

}

到了这里,关于Socket实现双机通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Visual Studio】报错 ASSERT: “i >= 0 && i < size()“,使用 C++ 语言,配合 Qt 开发串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 这个 Bug 是我做这个工程时遇到的:【Visual Studio】Qt 的实时绘图曲线功能,使用 C++ 语言,配合 Qt 开发串口通信界面。 使用 C++ 语言,配合 Qt 开发串口通信界面,在调试动态绘图

    2024年02月11日
    浏览(41)
  • Android Studio的笔记--socket通信

    Socket 作为一种通用的技术规范,首次是由 Berkeley 大学在 1983 为 4.2BSD Unix 提供的,后来逐渐演化为 POSIX 标准。Socket API 是由操作系统提供的一个编程接口,让应用程序可以控制使用 socket 技术。 Socket API 不属于 TCP/IP协议簇,只是操作系统提供的一个是一个对 TCP / IP协议进行封

    2024年02月03日
    浏览(29)
  • 软件崩溃时Visual Studio中看不到有效的调用堆栈,使用Windbg动态调试去分析定位

    目录 1、问题说明 2、使用Windbg查看崩溃时详细的函数调用堆栈

    2024年02月05日
    浏览(43)
  • STM32 通过HAL库实现双机SPI程序烧录之一SPI双机通信

    主要功能:STM32F407VET6作为主机,STM32F103ZET6作为从机实现F4通过SPI接口发送数据给F1进行串口打印功能 主要是使用STM32cubemx进行相关配置(使用这个软件不能只用于生成代码,要学会读懂生成的每一句代码这样才方便后期调试,不然出现问题根本找不到) 选择Serial Waire进行调试

    2024年02月08日
    浏览(28)
  • stm32 GPIO模拟SPI接口实现双机通信

    一、SPI协议简介     一般主从方式工作,这种模式通常有一个主设备和一个或多个从设备,通常采用的是4根线,它们是MISO(主机输入从机输出)、MOSI(主机输出,针对主机来说)、SCLK(时钟,主机产生)、CS(片选,一般由主机发送或者直接使能,通常为低电平有效) ●

    2023年04月08日
    浏览(32)
  • 使用 python socket 实现UDP/TCP网络通信

    目录 目录 1.socket简介 2.创建socket 2.1创建UDPSocket 2.2创建TCPSocket 3.使用UDPSocket发送数据并接收 4.使用UDPSocket发送广播 5.UDPSocket聊天器 (多线程实现消息的收发功能) 6.使用TCPSocket建立客户端 7.使用TCPSocket建立服务端        socket(简称:套接字),是支持TCP和UDP(网络传输方式

    2023年04月10日
    浏览(50)
  • 超详细--vue3中使用socket.io-client + nodejs使用socket.io 实现实时通信

    第一步:安装插件 第二步:组件中引入使用 第一步:安装插件 第二步:在文件中引入使用

    2024年02月13日
    浏览(30)
  • 在Visual Studio上,使用OpenCV实现人脸识别

    本文介绍了如何在 Visual Studio 上,使用 OpenCV 来实现人脸识别的功能 环境说明 : 操作系统 : windows 10 64位 Visual Studio 版本 : Visual Studio Community 2022 (社区版) OpenCV 版本 : OpenCV-4.8.0 (2023年7月最新版) 实现效果如图所示,识别到的人脸会用红框框出来 : 这部分详见我的另一篇博客 :

    2024年02月12日
    浏览(48)
  • socket概述 python中如何使用TCP/UDP协议实现通信-教程

    很多编程语言中,都 使用scoket套接字实现网络通信。 Socket是对TCP/IP协议的封装,Socket本身就是一个调用接口(API),方便程序员用Socket使用TCP/IP协议簇,实现网络通信。 不同编程语言,shiyongSocket通信的语法有所区别,但基本原理类型相似。 它的两种方式,分别是TCP和UDP协

    2024年02月13日
    浏览(32)
  • 【SPI】STM32 SPI 双机通信,SPI从机模式使用

    最近要用到STM32的SPI从机模式,从其他板子读SPI数据过来,踩了2天坑,记录一下过程。 (因为hal库提供了三种函数,我调试的过程是阻塞、中断、DMA依次来调试学习的, 这份代码为使用DMA方式的代码。 ) 软件 :keil5、STM32CubeMX 硬件 :两块STM32F103C8T6最小系统 实现功能 :两

    2024年02月17日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包