首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

SOCKET发送结构体有关问题

2013-01-23 
SOCKET发送结构体问题现有代码如下服务端:#include WinSock2.h#include stdio.h#include string.h//

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的内存如下图:SOCKET发送结构体有关问题SOCKET发送结构体有关问题
这两个都一样啊,但是服务端接收到的数据pag不合适,pag和buf的内存如下图:SOCKET发送结构体有关问题SOCKET发送结构体有关问题


各位这个是怎么回事啊,帮帮忙啊
[解决办法]
你的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

热点排行