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

我用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楼那种复制粘贴不要来了

这可是我自己总结的,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);
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-01-18
你好,用CSocket发数据的时候要注意两点,这也是我编程的经验,一个是不能用send发送带结构的数据,比如说class,struct等等;另外一个是发送的数据不能太大,譬如说2M。
第2个回答  推荐于2018-04-21
结构传递需要引用吗?
以前自己写过1个FTP和HTTP的,也是SOCKET的
你试验下csrev.Send(TEF,300);看看,我只是好奇~本回答被网友采纳
第3个回答  2012-02-28
300改成sizeof(Sendj)

Socket send函数和recv函数详解
在Socket编程中,send函数用于向TCP连接另一端发送数据。无论客户端或服务器应用程序,均能使用此函数。客户端通常用send向服务器发送请求,而服务器则用它回应客户端。该函数接受套接字描述符、发送数据缓冲区、数据字节数及标志参数作为输入。函数比较要发送的数据长度与套接字的发送缓冲区大小。若大于...

SOCKET编程里send 和Receive函数的使用
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();...

send与recv函数详解
send函数用于socket通信中的数据发送,其原型为:ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);关键参数包括:sockfd:指定发送端套接字描述符。buff:存放要发送的数据缓冲区。nbytes:需要发送的实际数据字节数。flags:通常设置为0,可选参数用于高级功能。send函数的工作...

C++ Socket send recv 循环发送和接收 阻塞与缓冲区
WinSock函数 初始化WinSock使用WSAStartup函数;socket函数创建套接字;bind函数实现套接字与主机地址和端口号的绑定;listen函数设置套接字为监听状态;connect函数发起连接请求;accept函数接受连接请求;shutdown函数关闭套接字读写通道;closesocket函数关闭套接字并释放资源;WSACleanup函数终止WinSock使用。数据...

C# socket.send和receive方法
tcp\/ip协议是双工的。所谓双工,就是发送与接收可以同时进行。你当然可以send两次,但receive的情况是未知的,可能是一次,也可能是2次--当第一次发送完后缓冲区充满时。使用socket编成,准确地说,使用tcp\/ip协议编程时,务必要注意,无论是发送,还是接收,都不是接口能够控制的---tcp\/ip协议将在...

socket编程·send和recv
socket的send和recv是同时支持TCP和UDP的。从这两个函数的设计可以看出,协议简单来说就是读写数据。socket的选项是 SOCK_STREAM 。 send的返回值>0时,表示实际发送了多少字节。 注意: 只是copy到系统缓存里,系统决定什么时候会发送这些数据。 send的返回值==0时,这个在send空串时会发生,是...

WinSocket中的SendTo 和 ReceiveFrom函数 疑问??
sendto() 简述:向一指定目的地发送数据。include <winsock.h> int PASCAL FAR sendto( SOCKET s, const char FAR* buf, int len, int flags,const struct sockaddr FAR* to, int tolen);s:一个标识套接口的描述字。\/\/本地绑定端口 buf:包含待发送数据的缓冲区。len:buf缓冲区中数据的...

TCP协议之Send和Recv原理及常见问题分析
客户程序通常使用send函数向服务器发送请求,而服务器则经常使用send函数向客户端发送响应。 send函数的参数说明如下: 首先比较待发送数据的长度len和套接字s的发送缓冲的长度。针对这种情况,如果len大于剩余空间大小,send函数就会一直等待协议把s的发送缓冲中的数据发送完。如果len小于剩余空间大小,send函数仅将buf中的...

TCP之深入浅出send&recv
recv函数实现类似,从数据链路层接收数据帧,通过网卡驱动处理后,进入内核进行协议层处理,最终将数据放入socket的接收缓冲区。在实际应用中,非阻塞send时,发送端可能发送了大量数据,但实际只发送了部分,缓冲区中仍有大量数据未发送。接收端recv获取数据时,可能只收到部分数据。这种情况下,应用层需要...

请教关于socket编程的send函数
1 在socket阻塞时,send一定会等到将想要发送的数据copy到协议栈缓冲区为止(不管要发送的数据有多大),也就是说这个时候send返回的长度一定等于要发送的数据的长度,所以此时也不用循环send;2 在socket非阻塞时,send返回的长度可能小于要发送的数据的长度,所以此时用循环send;希望能帮到你,如果满意,...

相似回答