TCP协议传输结构体问题

jjlovedaisy 2009-11-18 04:15:52
server 端
=====================
// struct_server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <WINSOCK2.H>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
BOOL InitWinsock();

struct test1
{
char title[50];
int type;
};

void main()
{
InitWinsock();
SOCKET socketserv = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN addr_serv;
addr_serv.sin_family =AF_INET;
addr_serv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addr_serv.sin_port=htons(6000);

if(bind(socketserv,(SOCKADDR*)&addr_serv,sizeof(addr_serv))== SOCKET_ERROR)
{
printf("binding failed!");
return ;
}
printf ("waiting for client to connect....\n");
if(listen(socketserv,5)== SOCKET_ERROR)
{
printf("listening failed!");
return ;
}
SOCKADDR_IN clientsocket;
int len=sizeof(clientsocket);
SOCKET serConn = accept(socketserv,(SOCKADDR*)&clientsocket,&len);

struct test1 t1;
//t1.title ="go to hell";
//t1.type =2;
// test.name="the angel of god!" ;
// strcpy(test.name,"the angel of god");
char recvBuf[1024];

//send(serConn,(char*)&t1,sizeof(t1),0);


recv(serConn,recvBuf,1024,0);
memcpy(&t1,recvBuf,sizeof(recvBuf));

printf("start to receive!\n");
printf("title is %s, type is %d\n",t1.title,t1.type);

// recv(serConn,recvBuf,1024,0);

//recv(clientSocket,recvBuf,1024,0);
/// memcpy(&t1,recvBuf,sizeof(recvBuf));
}

BOOL InitWinsock()
{
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested=MAKEWORD(2,2);
Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
if(Error!=0)
{
return FALSE;
}
else
{
if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
{
WSACleanup();
return FALSE;
}

}
return TRUE;
}

Client 端
// struct_client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <WINSOCK2.H>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
BOOL InitWinsock();

struct str_title1
{
char title[50];
int type;
}t1={"silk silk silk",2};
void main()
{
InitWinsock();
SOCKET clientSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN clientsock_in;
clientsock_in.sin_family=AF_INET;
clientsock_in.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
clientsock_in.sin_port =htons(6000);
char recvBuf[1024];

if(connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(clientsock_in))==1)
{
printf("connecting failed!");
return ;
}printf("connection created!\n");

//str_title1 t1;
send(clientSocket,(char*)&t1,sizeof(t1),0);
//recv(clientSocket,recvBuf,1024,0);
//memcpy(&t1,recvBuf,sizeof(recvBuf));
//printf("title is %s, type is %d",t1.title,t1.type);


}

BOOL InitWinsock()
{
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested=MAKEWORD(2,2);
Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
if(Error!=0)
{
return FALSE;
}
else
{
if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
{
WSACleanup();
return FALSE;
}

}
return TRUE;
}


出现读取错误..................



然后我把客服端和服务端换了下


server side
// struct_server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <WINSOCK2.H>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
BOOL InitWinsock();

struct test1
{
char name[50];
int id;
}t1={"son of god!!!",1};

void main()
{
InitWinsock();
SOCKET socketserv = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN addr_serv;
addr_serv.sin_family =AF_INET;
addr_serv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addr_serv.sin_port=htons(6000);

if(bind(socketserv,(SOCKADDR*)&addr_serv,sizeof(addr_serv))== SOCKET_ERROR)
{
printf("binding failed!");
return ;
}
printf ("waiting for client to connect....\n");
if(listen(socketserv,5)== SOCKET_ERROR)
{
printf("listening failed!");
return ;
}
SOCKADDR_IN clientsocket;
int len=sizeof(clientsocket);
SOCKET serConn = accept(socketserv,(SOCKADDR*)&clientsocket,&len);
char recvBuf[1024];

send(serConn,(char*)&t1,sizeof(t1),0);
printf ("sending data finished");










}

BOOL InitWinsock()
{
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested=MAKEWORD(2,2);
Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
if(Error!=0)
{
return FALSE;
}
else
{
if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
{
WSACleanup();
return FALSE;
}

}
return TRUE;
}


client side

// struct_client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <WINSOCK2.H>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
BOOL InitWinsock();

struct str_title1
{
char title[50];
int type;
};
void main()
{
InitWinsock();
SOCKET clientSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN clientsock_in;
clientsock_in.sin_family=AF_INET;
clientsock_in.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
clientsock_in.sin_port =htons(6000);
char recvBuf[1024];

if(connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(clientsock_in))==1)
{
printf("connecting failed!");
return ;
}printf("connection created!\n");

str_title1 t1;
recv(clientSocket,recvBuf,1024,0);
memcpy(&t1,recvBuf,sizeof(recvBuf));
printf("title is %s, type is %d",t1.title,t1.type);


}

BOOL InitWinsock()
{
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested=MAKEWORD(2,2);
Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
if(Error!=0)
{
return FALSE;
}
else
{
if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
{
WSACleanup();
return FALSE;
}

}
return TRUE;
}

这样传输就没有问题

请问 是哪里出现错误....?
...全文
347 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jjlovedaisy 2009-11-18
  • 打赏
  • 举报
回复
谢谢 :)
goodname 2009-11-18
  • 打赏
  • 举报
回复
char recvBuf[1024];

sizeof(recvBuf)是数组的大小,应该是1024

如果strcpy(recvBuf,"abc");则
sizeof(recvBuf)仍然是数组的大小,还是1024
使用strlen(recvBuf),则为3

但是显然你传送过来的是个结构体,而且其中也存在'\0'所以strlen(),size()都不行。

应该使用t1的大小,或者根据recv返回值
lhy 2009-11-18
  • 打赏
  • 举报
回复
recvBuf比t1长
jjlovedaisy 2009-11-18
  • 打赏
  • 举报
回复
恩 3楼该的是正确的
但是我不知道为什么 sizeof(recvBuf) 就不正确了
goodname 2009-11-18
  • 打赏
  • 举报
回复
建议你看看3楼的建议
jjlovedaisy 2009-11-18
  • 打赏
  • 举报
回复
问题解决的方法是我在SERVER端加了一个 SEND函数

char sendBuf[1024] = "anything";
send(serConn,sendBuf,sizeof(sendBuf),0);


在客户端 加了一个 RECV函数


recv(clientSocket,recvBuf,1024,0);
printf("%s\n",recvBuf);

也就是说我在客服端和服务端都有接受和发送

如果在服务端只有发送 客户端只有接受 这个STRUCT可以发送成功
如果在服务端只有接受 而客户端换成发送的话 这个STRUCT 就不可以发送了


stjay 2009-11-18
  • 打赏
  • 举报
回复
memcpy(&t1,recvBuf,sizeof(recvBuf));
改成
memcpy(&t1,recvBuf,sizeof(t1));
jjlovedaisy 2009-11-18
  • 打赏
  • 举报
回复
struct_server.exe 中的 0xcccccccc 处未处理的异常: 0xC0000005: 读取位置 0xcccccccc 时发生访问冲突

出现的是这样的错误
Jimdo_260122332 2009-11-18
  • 打赏
  • 举报
回复
up

33,318

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧