C++ TCP通信 客户端程序

C++ TCP通信 客户端程序

/*
客户端编程思路
		初始化套接字库
	1、创建套接字socket(socket)
		地址处理以及端口处理
	2、向服务器发出连接请求(connect)
	3、请求连接后与服务器进行通信操作(send/recv)
	4、释放套接字资源(closesocket)
*/
#include <winsock.h>
#include <stdlib.h>
#include <stdio.h>
#pragma comment (lib,"ws2_32.lib") //显示加载套接字库
using namespace std;

int main()
{
	char server_addr[20];
	memset(server_addr, 0, sizeof(server_addr)); //初始化缓冲区
	printf("请输入服务器IP地址:");
	scanf_s("%s", &server_addr, 20);
	int server_port_number = 0;
	printf("请输入服务器端口号:");
	scanf_s("%d", &server_port_number);

	//初始化套接字库
	WSADATA wsadata; //定义一个WSADATA类型的结构体,存储被WSAStartup函数调用后返回的Windows Sockets数据
	WORD sock_version = MAKEWORD(2, 0); //设置版本号
	if (WSAStartup(sock_version, &wsadata)) //初始化套接字,启动构建,将“ws2_32.lib”加载到内存中
	{
		printf("WSAStartup failed \n");
		return 0;
	}

	//1、创建套接字socket(socket)
	//家族:ip地址IPV4 IPV6//协议类型//用户不确定什么方式 传0
	SOCKET sock_client = socket(AF_INET, SOCK_STREAM, 0); //创建一个对应IPv4的TCP套接字
	if (sock_client == INVALID_SOCKET)
	{
		printf("socket failed \n");
		return 0;
	}

	//地址处理以及端口处理
	sockaddr_in addr_client;
	addr_client.sin_family = AF_INET; //家族:ip地址IPV4
	addr_client.sin_port = htons(server_port_number); //htons 转换为u_short
	addr_client.sin_addr.S_un.S_addr = inet_addr(server_addr); //设置连接地址
	printf("客户端启动:\n");

	//2、向服务器发出连接请求(connect)
	int result = connect(sock_client, (sockaddr *)&addr_client, sizeof(addr_client));
	if (result == 0)
	{
		printf("服务器已连接。\n");

		char buffer[1024]; //用于接受数据的缓冲区
		memset(buffer, 0, sizeof(buffer)); //初始化缓冲区
		int irecver, isend;
		gets_s(buffer, 1024);

		while (1)
		{
			//3、请求连接后与服务器进行通信操作(send/recv)
			//发送数据
			printf("发送客户端数据:");
			gets_s(buffer, 1024);
			isend = send(sock_client, buffer, sizeof(buffer), 0); //发送数据
			if (isend == SOCKET_ERROR)
			{
				closesocket(sock_client);
				WSACleanup();
				Sleep(5000);
				return 0;
			}
			if (!(strcmp(buffer, "结束通信"))) //判断数据是否为结束标志,若是则关闭服务器
			{
				closesocket(sock_client); //关闭服务器套接字
				WSACleanup();
				Sleep(5000);
				return 0;
			}
			memset(buffer, 0, sizeof(buffer)); //初始化缓冲区,用于下一次数据的接收

			//接收数据
			irecver = recv(sock_client, buffer, sizeof(buffer), 0); //接收数据
			if (irecver > 0) //缓冲区有数据,开始读取数据
			{
				printf("接收服务器数据:%s\n", buffer);
			}
			else //接受数据失败
			{
				closesocket(sock_client);
				WSACleanup();
				Sleep(5000);
				return 0;
			}
			memset(buffer, 0, sizeof(buffer)); //初始化缓冲区,用于下一次数据的接收
		}
	}
	//4、 释放套接字资源(closesocket)
	closesocket(sock_client);
	WSACleanup();
	system("puase");
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值