SOCKET编程里send 和Receive函数的使用 50

我用send()函数需要发送3个数据:一个二维数组,一个字符串,一个整型变量。我定义了一个结构体:typedefstruct{BYTEtemp[10][9];intm;C... 我用send()函数需要发送3个数据:一个二维数组,一个字符串,一个整型变量。 我定义了一个结构体:
typedef struct
{
BYTE temp[10][9];
int m;
CString strt;
}Sendj;
定义了两个结构体变量:Sendj TES,TEF;
发送的时候:csrev.Send(&TEF,300);(服务器)
接受的时候:clconect.Receive(&TES,300);
在发送接受的时候出错:说内存不能为“read”,或是一个DEBUG错误。
请高手帮帮忙,这个问题怎么解决,重新设计代码也行,只要能把三个数据传过去。
csrev.send(TEF,300)不行。TEF这个参数的类型必须是地址
2楼那种复制粘贴不要来了
展开
 我来答
祚胤17
2009-05-16 · TA获得超过786个赞
知道大有可为答主
回答量:1148
采纳率:82%
帮助的人:591万
展开全部
这可是我自己总结的,LZ不要误会哦~~!
1.简单服务器
//#include <winsock2.h>
//#pragma comment(lib,"WS2_32.lib")
WSADATA sServer,sClient;
chat buf[1024];
int retVal;
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
return -1;//失败
}
sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sServer)
{
WSACleanup();
return -1;//创建套接字失败
}
SOCKADDR_IN addrServ;
addrServ.sin_family=AF_INET;
addrServ.sin_port=htons(%%1);
addrServ.sin_addr.s_addr=INADDR_ANY;
retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));
if(SOCKET_ERROR==retVal)
{
closesocket(sServer);
WSACleanup();
return -1;//绑定套接字失败
}
retVal=listen(sServer,1);
if(SOCKET_ERROR==retVal)
{
closesocket(sServer);
WSACleanup();
return -1;//开始监听失败
}
socketaddr_in addrClient;
int addrClientlen=sizeof(addrClient);
sClient=accept(sServer(sockaddr FAR*)&addrClient,&addClientlen);
if(INVALID_SOCKET==sClient)
{
closesocket(sServer);
WSACleanup();
return -1;//开始接受客户端连接失败
}
ZeroMemory(buf,sizeof(buf));
retVal=recv(sClient,buf,sizeof(buf));
if(SOCKET_ERROR==retVal)
{
closesocket(sServer);
closesocket(sClient);
WSACleanup();
return -1;//接收数据失败
}
CString %%2(buf);
closesocket(sServer);
closesocket(sClient);
WSACleanup();

2.简单客户端
//#include <winsock2.h>
//#pragma comment(lib,"WS2_32.lib")
WSADATA sHost;
SOCKADDR_IN addrServ;
chat buf[1024];
int retVal;
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
return -1;//失败
}
sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sHost)
{
WSACleanup();
return -1;//创建套接字失败
}
servAddr.sin_family=AF_INET;
servAddr.sin_addr.s_addr=inet_addr(%%1);
servAddr.sin_port=htons((short)%%2);
int nServAddlen=size(servAddr);
retVal=connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr));
if(sOCKET_ERROR==retVal)
closesocket(sHost);
WSACleanup();
return -1;//连接服务器失败
}
ZeroMemory(buf,sizeof(buf));
strcpy(buf,%%3);
retVal=send(sHost,buf,sizeof(buf),0);
if(SOCKET_ERROR==retVal)
{
closesocket(sHost);
WSACleanup();
return -1;//向服务器发送数据失败
}
closesocket(sHost);
WSACleanup();

3.获得本机IP
//#include <winsock2.h>
//#pragma comment(lib,"WS2_32.lib")
/*
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
return -1;//失败
}
*/
//#pragma comment(lib,"WS2_32.lib")
char szHostname[100],szHostaddress[200];
if(gethostname(szHostname,info(szHostname))!=SOCKET_ERROR)
{
HOSTENT *pHostEnt=gethostbyname(szHostname);
if(pHostEnt!=NULL){
sprintf(szHostaddress,"%d.%d.%d.%d",
( pHostEnt->h_addr_list[0][0]&0x00ff ),
( pHostEnt->h_addr_list[0][1]&0x00ff ),
( pHostEnt->h_addr_list[0][2]&0x00ff ),
( pHostEnt->h_addr_list[0][3]&0x00ff ));
}
}
else
return;
CString %%1(szHostaddress);
novikvski
2013-01-18 · 超过11用户采纳过TA的回答
知道答主
回答量:55
采纳率:0%
帮助的人:22.6万
展开全部
你好,用CSocket发数据的时候要注意两点,这也是我编程的经验,一个是不能用send发送带结构的数据,比如说class,struct等等;另外一个是发送的数据不能太大,譬如说2M。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zzjking01
推荐于2018-04-21
知道答主
回答量:24
采纳率:100%
帮助的人:0
展开全部
结构传递需要引用吗?
以前自己写过1个FTP和HTTP的,也是SOCKET的
你试验下csrev.Send(TEF,300);看看,我只是好奇~
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pmsl_bmiv
2012-02-28 · TA获得超过172个赞
知道小有建树答主
回答量:236
采纳率:0%
帮助的人:157万
展开全部
300改成sizeof(Sendj)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式