如何通过Windows winsock send()发送包含指针的结构? 我使用Winsock .< /P>在C++中创建服务器/客户端程序
将如何通过Windows winsock send()发送包含指针的结构? 我使用Winsock .< /P>在C++中创建服务器/客户端程序,c++,c,sockets,C++,C,Sockets,将SLogin和Sid打包到char数组中 Sidtobuf[0] 和SLogin到buf[1] Sid从buf[0]获取 从buf[1]获取Slogin时出现问题。 这是我的代码: #include <Winsock2.h> #include <Windows.h> #include <stdio.h> #include <string> #pragma comment (lib, "ws2_32.lib") struct Sid {
SLogin
和Sid
打包到char数组中
Sid
tobuf[0]
和SLogin
到buf[1]
Sid
从buf[0]获取
buf[1]
获取Slogin
时出现问题。
这是我的代码:
#include <Winsock2.h>
#include <Windows.h>
#include <stdio.h>
#include <string>
#pragma comment (lib, "ws2_32.lib")
struct Sid
{
unsigned int id;
};
struct SLogin
{
char * login;
char * password;
};
struct SloginRet
{
bool OkOrFalse;
};
SOCKET sSocket = INVALID_SOCKET;
void Connect()
{
WSAData data;
if(WSAStartup(MAKEWORD(2,2), &data) != NO_ERROR)
{
printf("WSAStartup: %d\n", WSAGetLastError());
return;
}
sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sSocket == INVALID_SOCKET)
{
printf("socket: %d\n", WSAGetLastError());
return;
}
sockaddr_in service;
memset(&service, 0, sizeof(service));
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(5000);
connect(sSocket, (SOCKADDR*)&service, sizeof(service));
Sid idd;
idd.id = 1001;
char buffer[1];
memcpy(&buffer[0], &idd, sizeof(idd));
Sid ida;
memcpy( &ida, &buffer[0], sizeof(int));
printf("%d %d\n", ida.id, sizeof(buffer));
SLogin login;
login.login = "Vitor";
login.password = "123";
memcpy(&buffer[1], &login, sizeof(char));
SLogin *pLogin = (SLogin*)buffer[1];
printf("%s", pLogin->login);
// send(sSocket, buffer,strlen(buffer), 0);
closesocket(sSocket);
WSACleanup();
}
void main()
{
Connect();
system("pause");
}
Server Recv:
recv(socket,buffer,1,0);
char buffer[1]; //receive
Sid id;
memcpy(&id, &buffer[0],sizeof(buffer[0]));
SLogin login;
memcpy(&login, &buffer[1],sizeof(buffer[1]));
#包括
#包括
#包括
#包括
#pragma注释(lib,“ws2_32.lib”)
结构Sid
{
无符号整数id;
};
结构斯洛金
{
字符*登录;
字符*密码;
};
SloginRet结构
{
布尔·奥科法斯;
};
SOCKET sSocket=无效的_插座;
void Connect()
{
WSAData数据;
if(WSAStartup(MAKEWORD(2,2),&数据)!=无错误)
{
printf(“wsastartp:%d\n”,WSAGetLastError());
回来
}
sSocket=套接字(AF_INET、SOCK_STREAM、IPPROTO_TCP);
if(sSocket==无效的_套接字)
{
printf(“套接字:%d\n”,WSAGetLastError());
回来
}
正在使用的sockaddr_;
memset(&service,0,sizeof(服务));
service.sinu family=AF\u INET;
service.sin_addr.s_addr=inet_addr(“127.0.0.1”);
service.sin_port=htons(5000);
连接(sSocket,(SOCKADDR*)和服务,sizeof(服务));
Sid-idd;
idd.id=1001;
字符缓冲区[1];
memcpy(&buffer[0],&idd,sizeof(idd));
希德·艾达;
memcpy(&ida,&buffer[0],sizeof(int));
printf(“%d%d\n”,ida.id,sizeof(buffer));
SLogin登录;
login.login=“Vitor”;
login.password=“123”;
memcpy(&buffer[1],&login,sizeof(char));
SLogin*pLogin=(SLogin*)缓冲区[1];
printf(“%s”,pLogin->login);
//发送(sSocket,buffer,strlen(buffer),0);
闭合插座(sSocket);
WSACleanup();
}
void main()
{
Connect();
系统(“暂停”);
}
服务器记录:
recv(插座,缓冲器,1,0);
字符缓冲区[1]//接收
Sid id;
memcpy(&id,&buffer[0],sizeof(buffer[0]);
SLogin登录;
memcpy(&login,&buffer[1],sizeof(buffer[1]);
使用memcpy
将Sid
复制到char-array-buf[0]
,(char-buf[1]
)
并从buf OK获取Sid
我在SLogin上的错误:
我使用
memcpy
SLogin
登录到buf[1]
并从有问题的buf获取SLogin
。您没有分配足够的内存。您的buffer
的大小只有1char
(sizeof(char)
是1字节),但您正试图将12个字节填充到其中(sizeof(Sid)
是4个字节,sizeof(SLogin)
是8个字节)。即使您分配了足够的内存,它仍然无法工作,因为SLogin
包含指向外部内存的指针,您没有将其序列化为可以安全发送/接收的连续格式
请尝试类似以下内容:
#pragma pack(push, 1)
// or equivilent for your compiler
struct Sid
{
unsigned int id;
};
struct SLogin
{
char login[20];
char password[20];
};
#pragma pack(pop)
// or equivilent for your compiler
请告诉我们错误。不要将结构用作网络协议。您正在介绍至少六个依赖项,我在其他类似问题中列举了这些依赖项。定义一个应用程序协议(以八位字节为单位),并编写一个库来发送和接收它。
#include <Winsock2.h>
#include <Windows.h>
#include <stdio.h>
#include <string>
#pragma comment (lib, "ws2_32.lib")
SOCKET sSocket = INVALID_SOCKET;
void Connect()
{
WSAData data;
int err = WSAStartup(MAKEWORD(2,2), &data);
if (err != NO_ERROR)
{
printf("WSAStartup: %d\n", err);
return;
}
sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sSocket == INVALID_SOCKET)
{
printf("socket: %d\n", WSAGetLastError());
return;
}
sockaddr_in service;
memset(&service, 0, sizeof(service));
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(5000);
if (connect(sSocket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR)
{
printf("connect: %d\n", WSAGetLastError());
closesocket(sSocket);
return;
}
char buffer[sizeof(Sid)+sizeof(SLogin)];
Sid *pSid = (Sid*) &buffer[0];
PSid->id = 1001;
printf("%ul\n", pSid->id);
SLogin *pLogin = (SLogin*) &buffer[sizeof(Sid)];
strncpy(pLogin->login, "Vitor", 20);
strncpy(pLogin->password, "123", 20);
printf("%.20s\n", pLogin->login);
//send(sSocket, buffer, sizeof(buffer), 0);
closesocket(sSocket);
WSACleanup();
}
void main()
{
Connect();
system("pause");
}
char buffer[256]; //receive
int numBytes = recv(socket, buffer, sizeof(buffer), 0);
...
Sid *pSid = (Sid*) &buffer[0];
SLogin *pLogin = (SLogin*) &buffer[sizeof(Sid)];