自己练习,存在问题:服务端接收数据乱码,没有找到原因
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;
}