发送端:
struct Protocol{ //自定义协议结构
......
DWORD sqnum; //流水号
.....; //length+sqnum+data的校验和
struct CommonFrame data; //数据
};
struct CommonFrame{ //在客户端发送的数据帧
..........
char *buffer;
........
};
int end=0;
char m_buff[500];
char send_buff[500];
Protocol protocol_send;
DWORD i,packageID;
i=0;
strcpy (m_buff,pDlg->m_MsgSend);(m_MsgSend为对话框输入的字符串)
memcpy (send_buff, m_buff,500);
protocol_send.data.buffer=send_buff;
packageID=i+2; //流水号从2开始
protocol_send.sqnum=packageID;//发送数据包中的流水号
end=sockClient.Send(&protocol_send,sizeof(protocol_send));
DWORD RecvID;
sockClient.Receive(&RecvID,sizeof(RecvID));
if (RecvID==packageID)
{
AfxMessageBox("对方收到此数据包");
continue;
}
.................
接受端:
.................
Protocol protocol_recv;
int ret=0;
ret=recSo.Receive(&protocol_recv,sizeof(protocol_recv));
if(ret==0)
{
AfxMessageBox("没收到数据");
}
DWORD packageid;
packageid=protocol_recv.sqnum; //收到数据包的流水号
recSo.Send(&packageid,sizeof(packageid));
...........
对话框输入的字符串不能在不同计算机的接受端显示,sqnum 则可以查到其值,
请高手指点!小弟才学SOCKET,此问题捆饶多天,自己实在不能......
end=sockClient.Send(&protocol_send,sizeof(protocol_send));
中的sizeof(protocol_send)并没有包括你实际要发送的数据m_buff的大小,它只包含了一个指针的大小。要将你要发送的实际数据包含在数据包中。可以改结构体CommonFrame的定义,如:
struct CommonFrame{ //在客户端发送的数据帧
..........
char buffer[500];
........
};
memcpy (protocol_send.data.buffer, m_buff,500);
然后发送就OK了。
一定要在结构体里面定义一个数据区的长度,否则就会出错的,当然像上面这样做也是可以的
不过最大长度就被限制了
同时你还要注意你的内存块是否在发送前就被释放掉了
另一端不接收,有可能是你根本没有把数据发出去,在发的时候数据区已经被释放掉了
或者是像上面这样数据区的长度没有计算对
我也出了很多这样的错,希望对你有帮助