首页 > 其他分享 >简单C/S模型代码

简单C/S模型代码

时间:2023-01-23 10:32:00浏览次数:37  
标签:addr socketServer int 代码 printf si 简单 模型 SOCKET

server.c

#define _CRT_SECURE_NO_WARNINGS

#include<WinSock2.h>// windows socked 第二版本
#pragma comment(lib, "Ws2_32.lib")
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//#include <WS2tcpip.h>
int main()
{
	// 启动网络库
	WORD wdVersion = MAKEWORD(2, 2);// 高字节 副版本
	WSADATA wdSockMsg;
	int nRes = WSAStartup(wdVersion, &wdSockMsg);
	if (0 != nRes)
	{
		switch (nRes)
		{
		case WSASYSNOTREADY:
			printf("亲亲,重启下电脑试试,或者检查网络库\n");
			break;
		case WSAVERNOTSUPPORTED:
			printf("请更新网络库\n");
			break;
		case WSAEINPROGRESS:
			printf("重新启动\n");
			break;
		case WSAEPROCLIM:
			printf("请尝试关闭不必要的软件,以为当前网络提供充足资源\n");
			break;
		case WSAEFAULT:
			break;
		}
		
		return 0;
	}
	// 校验版本
	if (2 != HIBYTE(wdSockMsg.wVersion) || 2 != LOBYTE(wdSockMsg.wVersion))
	{
		// 说明版本不对
		WSACleanup();// 关闭/清理网络库
		return 0;
	}
		
	SOCKET socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (INVALID_SOCKET == socketServer)
	{
		int a = WSAGetLastError();
		// 清理网络库
		WSACleanup();
		return 0;
	}

	// 2017以上不支持inet_addr
	/*struct sockaddr_in si;
	si.sin_family = AF_INET;
	si.sin_port = htons(12345);
	si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");*/
	
	struct sockaddr_in si;
	si.sin_family = AF_INET;
	si.sin_port = htons(12345);
	struct in_addr s;//存放Ipv4地址的结构体
	inet_pton(AF_INET, "127.0.0.1", (void*)&si.sin_addr.S_un.S_addr);//进行转换
	// 绑定地址与端口
	int bres = bind(socketServer, (const struct sockaddr*)&si, sizeof(si));
	if (SOCKET_ERROR == bres)
	{
		// 出错了
		int a = WSAGetLastError();
		// 释放
		closesocket(socketServer);
		WSACleanup();
		return 0;
	}

	int lisr = listen(socketServer, SOMAXCONN);
	if (SOCKET_ERROR == lisr)
	{
		// 出错了
		int a = WSAGetLastError();
		// 释放
		closesocket(socketServer);
		WSACleanup();
		return 0;
	}

	// for
	// 创建客户端链接
	struct sockaddr_in clientMsg;
	int len = sizeof(clientMsg);
	SOCKET socketClient = accept(socketServer, (struct sockaddr*)&clientMsg, &len);
	if (INVALID_SOCKET == socketClient)
	{
		// printf("客户端链接失败\n");
		// 出错了
		int a = WSAGetLastError();
		// 释放
		closesocket(socketServer);
		WSACleanup();
		return 0;
	}
	printf("客户端链接成功\n");


	/*
	* 服务器打印客户端链接成功
	* 向客户端发送  我是服务器,已与你成功创建链接
	* 客服端发送    谢谢
	*/

	// send
	int redr = send(socketClient, "我是服务器,已与你成功创建链接", 50, 0);
	if (SOCKET_ERROR == redr)
	{
		// 出错了
		int a = WSAGetLastError();
		// 根据实际情况处理
	}


	while (1)
	{
		// recv
		char buf[1500] = { 0 };
		int res = recv(socketClient, buf, 1499, 0);
		if (res == 0)
		{
			printf("连接中断,客户端下线\n");
		}
		else if (SOCKET_ERROR == res)
		{
			// 出错了
			int a = WSAGetLastError();
			// 根据实际情况处理
		}
		else
		{
			printf("%d  %s\n", res, buf);
		}

		scanf("%s", buf);
		// send
		redr = send(socketClient, buf, strlen(buf), 0);
		if (SOCKET_ERROR == redr)
		{
			// 出错了
			int a = WSAGetLastError();
			// 根据实际情况处理
		}
	}
	


	closesocket(socketServer);
	closesocket(socketClient);
	WSACleanup();
	
	system("pause");
	return 0;
}

client.c

#define _CRT_SECURE_NO_WARNINGS

#include<WinSock2.h>// windows socked 第二版本
#pragma comment(lib, "Ws2_32.lib")
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include <WS2tcpip.h>
int main()
{
	WORD wdVersion = MAKEWORD(2, 2);// 高字节 副版本
	WSADATA wdSockMsg;
	int nRes = WSAStartup(wdVersion, &wdSockMsg);
	if (0 != nRes)
	{
		switch (nRes)
		{
		case WSASYSNOTREADY:
			printf("亲亲,重启下电脑试试,或者检查网络库\n");
			break;
		case WSAVERNOTSUPPORTED:
			printf("请更新网络库\n");
			break;
		case WSAEINPROGRESS:
			printf("重新启动\n");
			break;
		case WSAEPROCLIM:
			printf("请尝试关闭不必要的软件,以为当前网络提供充足资源\n");
			break;
		case WSAEFAULT:
			break;
		}

		return 0;
	}
	// 校验版本
	if (2 != HIBYTE(wdSockMsg.wVersion) || 2 != LOBYTE(wdSockMsg.wVersion))
	{
		// 说明版本不对
		WSACleanup();// 关闭/清理网络库
		return 0;
	}

	SOCKET socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// 客户端创建服务器的socket
	if (INVALID_SOCKET == socketServer)
	{
		int a = WSAGetLastError();
		// 清理网络库
		WSACleanup();
		return 0;
	}


	// 链接服务器
	struct sockaddr_in serverMsg;
	serverMsg.sin_family = AF_INET;
	serverMsg.sin_port = htons(12345);
	struct in_addr s;//存放Ipv4地址的结构体
	inet_pton(AF_INET, "127.0.0.1", (void*)&serverMsg.sin_addr.S_un.S_addr);//进行转换

	// 2017以上不支持inet_addr
	/*struct sockaddr_in si;
	si.sin_family = AF_INET;
	si.sin_port = htons(12345);
	si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");*/

	int conr = connect(socketServer, (struct sockaddr*)&serverMsg, sizeof(serverMsg));
	if (SOCKET_ERROR == conr)
	{
		int a = WSAGetLastError();
		closesocket(socketServer);

		WSACleanup();

		// system("pause");
		return 0;

	}


	while (1)
	{
		// recv
		char buf[1500] = { 0 };
		int res = recv(socketServer, buf, 1499, 0);
		if (res == 0)
		{
			printf("连接中断,客户端下线\n");
		}
		else if (SOCKET_ERROR == res)
		{
			// 出错了
			int a = WSAGetLastError();
			// 根据实际情况处理
		}
		else
		{
			printf("%d  %s\n", res, buf);
		}

		scanf("%s", buf);
		// send
		int redr = send(socketServer, buf, strlen(buf), 0);
		if (SOCKET_ERROR == redr)
		{
			// 出错了
			int a = WSAGetLastError();
			// 根据实际情况处理
		}
	}

	



	closesocket(socketServer);

	WSACleanup();

	system("pause");
	return 0;


}

标签:addr,socketServer,int,代码,printf,si,简单,模型,SOCKET
From: https://blog.51cto.com/u_15093262/6021816

相关文章

  • C# 简单实现 奇葩排序中的算盘排序(算珠排序)算法
    Console.WriteLine("HelloWorld!");int[]arr={1,3,4,0,22,4,0,6,3,10,8,6,7};Console.WriteLine(string.Join(",",arr.ToList(......
  • 为什么我晚上 9 点还在写代码
    我向软件开发人员传达的信息一直非常一致:你不需要加班就能成功。工作更多只是贵公司的免费劳动力。保护您的个人时间。但是有一天,我很晚才坐车回家。我没有值班。那天......
  • dremio api 简单说明
    以前在简单介绍dremiowebserver的时候提过dremio的api,实际上包含了量大部分,一个是为了bff的(方便前端使用的),一个是独立的restapi方便业务调用的(实际上就是官方文档中看......
  • 基于深度学习的轻量化姿态检测模型设计-原
    基于深度学习的轻量化姿态检测模型设计摘要:随着深度神经网络和智能移动设备的快速发展,单目人体姿态检测的技术门槛逐步降低,网络结构轻量化设计逐渐成为前沿且热门的研......
  • 并查集及简单的力扣例题
    优秀讲解视频,五分钟让你理解并查集的核心:youtube.com/watch?v=ayW5B2W9hfo看完感觉并查集其实也很容易,不是特别艰深的概念并查集的构成:group,element,father/representati......
  • 1582_C代码实现的快速、可移植MD5信息摘要算法
    全部学习汇总:​​GreyZhang/c_units:Asmallpieceofcodewhichcanbereuseanywhere,Icallitaunit.ThisisacollectionofunitinClanguage!Ok,yes,it......
  • 这段代码应该怎么去理解呢
    提问: PARITYParity(unsignedchar*buf,intiBufLen){intcountones=0;inti;intj;unsignedchariMask=0x80;for(i=0;i<iBuf......
  • 在Visual Studio2022使用AStyle格式化代码
    前言 最近用VS2022写C++代码,虽然可以直接设置自己的代码风格,但效果并不那么如意,甚至在格式化后的代码还有下面这样的     于是我又试着使用了clang-forma......
  • 代码随想录算法训练营第24天
    今日刷题1道:学习回溯算法的理论基础+组合。理论基础: 题目链接/文章讲解:https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9......
  • 使用SignalR实现简单聊天室和推送广告
    所需材料:一个SignalR处理程序、一个前端页面、一个后端推广告服务、配置。1、SignalR继承自Hub,里面有一个群发消息的方法,可以控制访问权限。///<summary>///......