C++ 模拟客户端和服务端

自己练习,存在问题:服务端接收数据乱码,没有找到原因

1.服务端代码

Server.cpp

#include<iostream>
#include<windows.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<winsock2.h>
#include<wchar.h>
using namespace std;
#define BUF_SIZE 100

char* UnicodeToUtf8(const wchar_t* unicode)
{
	int len;
	len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);
	char *szUtf8 = (char*)malloc(len + 1);
	memset(szUtf8, 0, len + 1);
	WideCharToMultiByte(CP_UTF8, 0, unicode, -1, szUtf8, len, NULL, NULL);
	return szUtf8;
}
string Utf8ToGbk(const char *src_str)
{
	int len = MultiByteToWideChar(CP_UTF8, 0, src_str, -1, NULL, 0);
	wchar_t* wszGBK = new wchar_t[len + 1];
	memset(wszGBK, 0, len * 2 + 2);
	MultiByteToWideChar(CP_UTF8, 0, src_str, -1, wszGBK, len);
	len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
	char* szGBK = new char[len + 1];
	memset(szGBK, 0, len + 1);
	WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);
	string strTemp(szGBK);
	if (wszGBK) delete[] wszGBK;
	if (szGBK) delete[] szGBK;
	return strTemp;
}
string GbkToUtf8(const char *src_str)
{
	int len = MultiByteToWideChar(CP_ACP, 0, src_str, -1, NULL, 0);
	wchar_t* wstr = new wchar_t[len + 1];
	memset(wstr, 0, len + 1);
	MultiByteToWideChar(CP_ACP, 0, src_str, -1, wstr, len);
	len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
	char* str = new char[len + 1];
	memset(str, 0, len + 1);
	WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
	string strTemp = str;
	if (wstr) delete[] wstr;
	if (str) delete[] str;
	return strTemp;
}

int main()
{
	
	WSADATA ws;
	WSAStartup(MAKEWORD(2,2),&ws);
	SOCKET servSock = socket(AF_INET, SOCK_STREAM, 0);
	    //绑定套接字
	    struct sockaddr_in sockAddr;
	    memset(&sockAddr, 0, sizeof(sockAddr));  //每个字节都用0填充
	    sockAddr.sin_family = PF_INET;  //使用IPv4地址
	    sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");  //具体的IP地址
	    sockAddr.sin_port = htons(8899);  //端口
	    bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
	    //进入监听状态
	    listen(servSock, 20);
	    //接收客户端请求
	    SOCKADDR clntAddr;
	    int nSize = sizeof(SOCKADDR);
	    char buffer[BUF_SIZE] = {0};  //缓冲区
	    while(1){
	        SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);
	        int strLen = recv(clntSock, buffer,sizeof(buffer)-1, 0);  //接收客户端发来的数据
	        if(strLen>0)
	        {
				wchar_t wc[]=L"这是一个自定义的消息内容!";
				char* ct=UnicodeToUtf8(wc);
				cout<<"发送数据大小为:"<<strlen(ct);
	        	//cout<<"接收客户端数据为:\r\n"<<GbkToUtf8(buffer)<<"\r\n消息结束。";
	        	
					//cout<<"接收客户端数据为:\r\n"<<buffer<<"\r\n消息结束。";
			printf("接收客户端数据为:\r\n%s\r\n消息结束。",buffer);
	        	string msg="HTTP/1.1 200 OK\r\n";
				msg+="Accept-Encoding:gzip, deflate, br\r\n";
				msg+="Content-Type: text/html;charset=utf-8\r\n";
				msg+="Content-Length: ";
				msg+=to_string(strlen(ct))+"\r\n\r\n";
				
				msg+=ct;
				if(send(clntSock,msg.c_str() , msg.size(), 0)>0)
				{cout<<"发送成功!";}
				else
				{
					cout<<"发送失败!";
				};  //将数据原样返回
				
			}
	        
	        closesocket(clntSock);  //关闭套接字
	        memset(buffer, 0, BUF_SIZE);  //重置缓冲区
	    }
	    //关闭套接字
	    closesocket(servSock);
	    //终止 DLL 的使用
	    WSACleanup();
	    return 0;
	return 0;
}

2.客户端代码

#include<iostream>
#include<windows.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<winsock2.h>

using namespace std;
#define BUF_SIZE 100



int main()
{
	char bufSend[BUF_SIZE] = {0};
	char bufRecv[BUF_SIZE] = {0};
	WSADATA ws;
	WSAStartup(MAKEWORD(2,2),&ws);

	    //绑定套接字
	    struct sockaddr_in sockAddr;
	    memset(&sockAddr, 0, sizeof(sockAddr));  //每个字节都用0填充
	    sockAddr.sin_family = PF_INET;  //使用IPv4地址
	    sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");  //具体的IP地址
	    sockAddr.sin_port = htons(8899);  //端口
	    for(;;)
		{
			SOCKET clientSock = socket(AF_INET, SOCK_STREAM, 0);
			connect(clientSock,(SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
			printf("Input a string: ");
			gets(bufSend);
			send(clientSock, bufSend, strlen(bufSend), 0);
			//接收服务器传回的数据
			recv(clientSock, bufRecv, BUF_SIZE, 0);
			//输出接收到的数据
			cout<<"服务端返回数据为:"<<bufRecv;
			closesocket(clientSock);  //关闭套接字
			memset(bufSend, 0, BUF_SIZE);  //重置缓冲区
			memset(bufRecv, 0, BUF_SIZE);
			closesocket(clientSock);
		}
	   
	        
	    
	    //关闭套接字
	    
	    //终止 DLL 的使用
	    WSACleanup();
	    
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值