思路:在客户端把结构体转换成数组存放在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