SOCKET发送结构体问题
现有代码如下
服务端:
#include <WinSock2.h>
#include <stdio.h>
#include <string.h>
//数据包包头
typedef struct _tag_M2M_HEAD
{
int size;//数据报的长度
int cmdid;//命令码
intseqid;//流水号
int versionnum;//版本号
char SecurityID;//安全标识
char ReserveWord;//保留字
int terminalID;//终端序列号
}M2M_HEAD;
//数据包
typedefstruct _tag_M2M_PACKAGE
{
M2M_HEADhead;//数据报的包头
//数据包包体
chardata[100];//要发送的数据
intn;//重发次数,初始值3
time_tt;//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;//命令码
intseqid;//流水号
int versionnum;//版本号
char SecurityID;//安全标识
char ReserveWord;//保留字
int terminalID;//终端序列号
}M2M_HEAD;
//数据包
typedefstruct _tag_M2M_PACKAGE
{
M2M_HEADhead;//数据报的包头
//数据包包体
chardata[100];//要发送的数据
intn;//重发次数,初始值3
time_tt;//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());
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;
}
//绑定IP地址,端口号
addrSrv.sin_family = AF_INET;
addrSrv.sin_addr.S_un.S_addr = inet_addr(ipAdress);
addrSrv.sin_port = htons(port);
nRes = bind(sockSvr, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
return 1;
}
int sendmsg(char *buf)
{
//SOCKADDR_IN sockCli;
int nLen = sizeof(SOCKADDR_IN);
sendto(sockSvr, buf, strlen(buf)+1, 0, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
memset(buf, 0, strlen(buf));
recvfrom(sockSvr, buf, 1024, 0, (SOCKADDR*)&sockCli, &nLen);
return 0;
}
int main()
{
char str[1024] = {0};
M2M_PACKAGE pag;
InitCliSocket("127.0.0.1", 6000);
memset(&pag, 0, sizeof(M2M_PACKAGE));
pag.head.cmdid = 111;
pag.head.ReserveWord = 'a';
pag.head.SecurityID = '1';
pag.head.seqid = 112;
pag.head.size = 123;
pag.head.terminalID = 113;
pag.head.versionnum = 114;
strcpy(pag.data, "adf");
pag.n = 3;
pag.t = 20121212;
memcpy(str, &pag, sizeof(M2M_PACKAGE));
sendmsg(str);
//关闭socket
closesocket(sockSvr);
return 1;
}
现在发送结构体的时候只接受到size,也就是123,其他的都没有,这是怎么回事啊,发送的时候客户端pag和str的内存如下图:

这两个都一样啊,但是服务端接收到的数据pag不合适,pag和buf的内存如下图:

各位这个是怎么回事啊,帮帮忙啊
[解决办法]
你的buff里面 是 7b 00 00 00 6f 00 00 00
7b后面那个 00 就是 '\0'了 strlen(buf)求出来的是1
[解决办法]
sendmsg中加个结构体的长度做参数,sendto中不能用strlen,这有许多socket例子,你参考一下是怎样发送结构体数据的:
http://download.csdn.net/detail/geoff08zhang/4571358