SOCKET发送结构体有关问题
SOCKET发送结构体问题
现有代码如下
服务端:
#include <WinSock2.h>
#include <stdio.h>
#include <string.h>
//数据包包头
typedef struct _tag_M2M_HEAD
{
int size; // 数据报的长度
int cmdid; // 命令码
int seqid; // 流水号
int versionnum; // 版本号
char SecurityID; // 安全标识
char ReserveWord; // 保留字
int terminalID; // 终端序列号
}M2M_HEAD;
//数据包
typedef struct _tag_M2M_PACKAGE
{
M2M_HEAD head; // 数据报的包头
//数据包包体
char data[100]; // 要发送的数据
int n; // 重发次数,初始值3
time_t t; //time_t表示有符号64位整数数据类型 下次发送的时间
} M2M_PACKAGE;
int initsocket()
{
WORD wVersionRequested;
WSADATA wsaData;
int nRes = 0;
SOCKET sockSvr;
int nErrCode = 0;
int bExit = 0;
SOCKADDR_IN addrSrv;
wVersionRequested = MAKEWORD(1, 1);
nRes = WSAStartup(wVersionRequested, &wsaData);
if (0 != nRes)
{
printf("err code:%d", WSAGetLastError());
return 0;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
printf("VERSION DIFF");
WSACleanup();
return 0;
}
sockSvr = socket(AF_INET, SOCK_DGRAM, 0);
if (INVALID_SOCKET == sockSvr)
{
printf("err code:%d", WSAGetLastError());
return 0;
}
addrSrv.sin_family = AF_INET;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_port = htons(6000);
nRes = bind(sockSvr, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
while (!bExit)
{
SOCKADDR_IN sockCli;
char buf[1024] = {0};
M2M_PACKAGE pag;
int nLen = sizeof(SOCKADDR_IN);
int nRes;
recvfrom(sockSvr, buf, 1024, 0, (SOCKADDR*)&sockCli, &nLen);
memset(&pag, 0, sizeof(M2M_PACKAGE));
memcpy(&pag, buf, sizeof(M2M_PACKAGE));
printf("%s\n", buf);
}
closesocket(sockSvr);
return 0;
}
int main()
{
initsocket();
return 1;
}
客户端:
#include <WinSock2.h>
#include <stdio.h>
SOCKADDR_IN addrSrv;
SOCKET sockSvr;
SOCKADDR_IN sockCli;
//数据包包头
typedef struct _tag_M2M_HEAD
{
int size; // 数据报的长度
int cmdid; // 命令码
int seqid; // 流水号
int versionnum; // 版本号
char SecurityID; // 安全标识
char ReserveWord; // 保留字
int terminalID; // 终端序列号
}M2M_HEAD;
//数据包
typedef struct _tag_M2M_PACKAGE
{
M2M_HEAD head; // 数据报的包头
//数据包包体
char data[100]; // 要发送的数据
int n; // 重发次数,初始值3
time_t t; //time_t表示有符号64位整数数据类型 下次发送的时间
} M2M_PACKAGE;
//绑定ip地址和端口号
int InitCliSocket(char *ipAdress, int port)
{
WORD wVersionRequested;
WSADATA wsaData;
int nRes = 0;
int nErrCode = 0;
int bExit = 0;
wVersionRequested = MAKEWORD(1, 1);
nRes = WSAStartup(wVersionRequested, &wsaData);
if (0 != nRes)
{
printf("err code:%d", WSAGetLastError());
现有代码如下
服务端:
#include <WinSock2.h>
#include <stdio.h>
#include <string.h>
//数据包包头
typedef struct _tag_M2M_HEAD
{
int size; // 数据报的长度
int cmdid; // 命令码
int seqid; // 流水号
int versionnum; // 版本号
char SecurityID; // 安全标识
char ReserveWord; // 保留字
int terminalID; // 终端序列号
}M2M_HEAD;
//数据包
typedef struct _tag_M2M_PACKAGE
{
M2M_HEAD head; // 数据报的包头
//数据包包体
char data[100]; // 要发送的数据
int n; // 重发次数,初始值3
time_t t; //time_t表示有符号64位整数数据类型 下次发送的时间
} M2M_PACKAGE;
int initsocket()
{
WORD wVersionRequested;
WSADATA wsaData;
int nRes = 0;
SOCKET sockSvr;
int nErrCode = 0;
int bExit = 0;
SOCKADDR_IN addrSrv;
wVersionRequested = MAKEWORD(1, 1);
nRes = WSAStartup(wVersionRequested, &wsaData);
if (0 != nRes)
{
printf("err code:%d", WSAGetLastError());
return 0;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
printf("VERSION DIFF");
WSACleanup();
return 0;
}
sockSvr = socket(AF_INET, SOCK_DGRAM, 0);
if (INVALID_SOCKET == sockSvr)
{
printf("err code:%d", WSAGetLastError());
return 0;
}
addrSrv.sin_family = AF_INET;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_port = htons(6000);
nRes = bind(sockSvr, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
while (!bExit)
{
SOCKADDR_IN sockCli;
char buf[1024] = {0};
M2M_PACKAGE pag;
int nLen = sizeof(SOCKADDR_IN);
int nRes;
recvfrom(sockSvr, buf, 1024, 0, (SOCKADDR*)&sockCli, &nLen);
memset(&pag, 0, sizeof(M2M_PACKAGE));
memcpy(&pag, buf, sizeof(M2M_PACKAGE));
printf("%s\n", buf);
}
closesocket(sockSvr);
return 0;
}
int main()
{
initsocket();
return 1;
}
客户端:
#include <WinSock2.h>
#include <stdio.h>
SOCKADDR_IN addrSrv;
SOCKET sockSvr;
SOCKADDR_IN sockCli;
//数据包包头
typedef struct _tag_M2M_HEAD
{
int size; // 数据报的长度
int cmdid; // 命令码
int seqid; // 流水号
int versionnum; // 版本号
char SecurityID; // 安全标识
char ReserveWord; // 保留字
int terminalID; // 终端序列号
}M2M_HEAD;
//数据包
typedef struct _tag_M2M_PACKAGE
{
M2M_HEAD head; // 数据报的包头
//数据包包体
char data[100]; // 要发送的数据
int n; // 重发次数,初始值3
time_t t; //time_t表示有符号64位整数数据类型 下次发送的时间
} M2M_PACKAGE;
//绑定ip地址和端口号
int InitCliSocket(char *ipAdress, int port)
{
WORD wVersionRequested;
WSADATA wsaData;
int nRes = 0;
int nErrCode = 0;
int bExit = 0;
wVersionRequested = MAKEWORD(1, 1);
nRes = WSAStartup(wVersionRequested, &wsaData);
if (0 != nRes)
{
printf("err code:%d", WSAGetLastError());