0
我使用Winsock在C++中創建服務器/客戶端程序。如何通過Windows發送包含指針的結構winsock send()?
包裝
SLogin
和Sid
到char array
Sid
到buf[0]
和SLogin
到buf[1]
Sid
從獲得buf[0]
問題從buf[1]
得到Slogin
。 這是我的代碼:來自BUF OK
#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]));
使用memcpy
複製Sid
到char array buf[0]
(char buf[1]
) 並獲得Sid
。
我的錯誤上SLogin
: 我複製與memcpy
SLogin
登錄buf[1]
,並從BUF Slogin
有問題的。
請告訴我們的錯誤。 – noelicus
不要使用結構作爲網絡協議。您至少引入了六個我在其他地方類似問題中列舉的依賴項。以八位字節定義一個應用協議,併爲自己寫一個庫來發送和接收它。 – EJP