思路:在客户端把结构体转换成数组存放在Send_Buf中,按字节流的方式发送到服务端,在服务端接收字节流存放到数组Recv_Buf中,这时候Recv_Buf中的值是正确的,但是用memcpy()把数组转换成结构体时,结构体中的内容不正确。接收端的程序如下
typedef struct Gate
{ int tx_wave;
int gate_length;
double gate_length1;
double gate_length2;
double start_time;
//List* channel_List2;
//List* channel_List3;
}Gate;
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <winsock2.h>
#include "main.h"
#include "read_config.h"
int main(int argc, char *argv[])
{
FILE *fp_cfg;
//Interface_Packet_Data *info;
Gate *info;
WSADATA wsaData;
struct sockaddr_in addr;
struct sockaddr_in ClientAddr;
int nSockErr;
char content[256];
int status;
double time_max;
char Recv_Buf[1024];
printf("*************************************\n");
printf("Read Config File...\n");
//Open Config File
fp_cfg = fopen(CONFIG_FILE, "r");
if(fp_cfg == NULL){
printf("Open Config File [%s] Failed.\n", CONFIG_FILE);
exit(0);
}
debug_enable = atoi(parse(fp_cfg, "Debug", SEPERATOR, content));
time_max = atof(parse(fp_cfg, "Max_Simtime", SEPERATOR, content));
//Winsock init
if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0){
printf("SERVER WSAStartup: Fail!\n");
return 0;
}
//Create a stream socket
sServerSock = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(parse(fp_cfg, "Server_Port", SEPERATOR, content)));
addr.sin_addr.s_addr = inet_addr(parse(fp_cfg, "Server_IP", SEPERATOR, content));
printf("SERVER open Config File : OK.\n");
printf("*************************************\n");
//Allocate address for the socket
if(bind(sServerSock, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR){
nSockErr = WSAGetLastError();
printf("SERVER Allocate Address for Client Socket: Fail. Error Code: %d\n", nSockErr);
return 0;
}
printf("*************************************\n");
printf("SERVER Listen.......\n");
//Server Listen
if(listen(sServerSock, 5) == SOCKET_ERROR){
nSockErr = WSAGetLastError();
printf("Server Listen Fail:Error Code: %d\n", nSockErr);
return 0;
}
printf("*************************************\n");
//Accept
int len = sizeof(ClientAddr);
if((sClinetSock = accept(sServerSock, (struct sockaddr *)&ClientAddr, &len)) == SOCKET_ERROR){
nSockErr = WSAGetLastError();
printf("Server Accept Fail: Error Code: %d\n", nSockErr);
return 0;
}
printf("*************************************\n");
printf("Accept a new remote connection:%s\r\n",inet_ntoa(ClientAddr.sin_addr));
printf("*************************************\n");
while(1)
{
int ret;
//info = (Interface_Packet_Data *)calloc(1, sizeof(Interface_Packet_Data));
//info = (Gate *)calloc(1, sizeof(Gate));
//ret=TCP_Receive_Block(sClinetSock, (char *)info, sizeof(Gate));
Gate *clt=(Gate *)calloc(1, sizeof(Gate));
// char *Recv_Buf=(char*)malloc(sizeof(clt));
memset(Recv_Buf,0,sizeof(Recv_Buf));
ret=recv(sClinetSock,Recv_Buf,sizeof(Recv_Buf),0);
printf("Recv_Buf Mesg:%s\n",Recv_Buf);
memset(clt,0,sizeof(Gate));
printf("Packet Report: \nOPNET Time = %f\ntx_wave = %d\n gate_length = %d\n gate_length1 = %f\ngate_length2 = %f\n", clt->start_time,clt->tx_wave,clt->gate_length,clt->gate_length1,clt->gate_length2);
memcpy(clt,Recv_Buf,sizeof(Gate));
//printf("Packet Report: \nOPNET Time = %f\ntx_wave = %d\n gate_length = %d\n gate_length1 = %f\ngate_length2 = %f\n", info->start_time,info->tx_wave,info-> gate_length,info-> gate_length1,info-> gate_length2);
printf("Packet Report: \ntx_wave = %d\n gate_length = %d\n gate_length1 = %f\ngate_length2 = %f\nOPNET Time = %f\n", clt->tx_wave,clt->gate_length,clt->gate_length1,clt->gate_length2,clt->start_time);
}
return 0;
}
结果如下
这是原因是什么?
用memcpy()函数把数组转结构体时,必须用到结构体的字节对齐吗?
解决方案
10
不是很懂你为什么要把结构转成数组,结构内存上也是字节流的,传输出现问题可能是字节序的问题
10
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545