关于socket通信中memcpy()把一个数组转换成结构体的问题

C语言 码拜 8年前 (2016-04-25) 1971次浏览
思路:在客户端把结构体转换成数组存放在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;
}

结果如下关于socket通信中memcpy()把一个数组转换成结构体的问题
这是原因是什么?
用memcpy()函数把数组转结构体时,必须用到结构体的字节对齐吗?

解决方案

10

不是很懂你为什么要把结构转成数组,结构内存上也是字节流的,传输出现问题可能是字节序的问题

10

不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于socket通信中memcpy()把一个数组转换成结构体的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)