我的代码是这样的,但在收接时总出错:
typedef struct Message
{
CString strUserName; //user name
CString strMessage; //the content of message
}Message;//send
Message Msg;
Msg.strUserName = m_strName;
Msg.strMessage = m_strMessage; //if (send(m_hSocket,m_strMessage.GetBuffer(0),m_strMessage.GetLength(),0) == 0)
int nSendLen = 0;
nSendLen = send(m_hSocket,(char *)&Msg,sizeof(Msg),0);
if ( nSendLen= 0 || nSendLen == SOCKET_ERROR)
{
AfxMessageBox(GetErrorString(WSAGetLastError()));
return;
}
//Receive
Message Msg ;
ZeroMemory(&Msg,sizeof(Msg)); nMessageLen = recv(hSocket,(char *)&Msg,1024,0);
if (nMessageLen ==0 || nMessageLen == SOCKET_ERROR)
{
MessageBox(GetErrorString(WSAGetLastError()),"Server ead",MB_OK|MB_ICONINFORMATION);
return 0;
}
typedef struct Message
{
CString strUserName; //user name
CString strMessage; //the content of message
}Message;//send
Message Msg;
Msg.strUserName = m_strName;
Msg.strMessage = m_strMessage; //if (send(m_hSocket,m_strMessage.GetBuffer(0),m_strMessage.GetLength(),0) == 0)
int nSendLen = 0;
nSendLen = send(m_hSocket,(char *)&Msg,sizeof(Msg),0);
if ( nSendLen= 0 || nSendLen == SOCKET_ERROR)
{
AfxMessageBox(GetErrorString(WSAGetLastError()));
return;
}
//Receive
Message Msg ;
ZeroMemory(&Msg,sizeof(Msg)); nMessageLen = recv(hSocket,(char *)&Msg,1024,0);
if (nMessageLen ==0 || nMessageLen == SOCKET_ERROR)
{
MessageBox(GetErrorString(WSAGetLastError()),"Server ead",MB_OK|MB_ICONINFORMATION);
return 0;
}
解决方案 »
- 急助!RegQueryValueEx问题
- clistctrl如何获得我正在编辑的子项的列索引
- 新手求助 WIN系统复制文件调用的API
- 列表框问题
- 创建和删除文件夹。
- 急!为什么我的SetWindowsHookEx不能用WH_MOUSE_LL参数
- CString类型的变量可以容纳多少字符啊?
- 推荐一个地方
- 如何利用VC的DAO设置一个属性列为自动增进型?
- TCP通信,正常发送接收几个小时后,报错:Stack around the variable 'pDataBufRev.buf was corrupted'
- 怎样得到某一数据库表中某一字段的最大值?
- VC 访问 MYSQL显示blob字段问题:难道是查询Mysql的记录集大小受限,还是VC的问题?
CopyMemory(pBuffer,strUserName.GetBuffer(),strUserName.GetLength());
CopyMemory(pBuffer+strUserName.GetLength(),strMessage.GetBuffer(),strMessage.GetLength());
//Send
...//Recv
strUserName=pBuffer;
strMessage=(pBuffer+szUserName.GetLength());
//=======================================
他说的方法绝对没问题,我想补充的就是
如果你发送的都是cstring,建议序列化
{
CString strUserName; //user name
CString strMessage; //the content of message
}Message;Message Msg ;
ZeroMemory(&Msg,sizeof(Msg)); //导致指向实际数据区的指针指空,以后当然装不了数据啦,所以当recv的数据填入后要出错。sizeof(Msg)=4*2=8;strUserName,strMessage其实只是一个指针,而且CString类型不能存储\0字符,遇\0就会把后面的字符自动截断(很恐怖的哟)。
想传结构最好用以下方式:
#define NAMELEN 32
#define MSGLEN 256
typedef struct Message
{
char czUserName[NAMELEN]; //user name
char czMessage[MSGLEN]; //the content of message
}Message;Message Msg;
//Msg.czUserName
//Msg.czMessage 填充//Send
nSendLen =(send(m_hSocket,&Msg,sizeof(Msg),0); //Receive
Message Msg ;
ZeroMemory(&Msg,sizeof(Msg));
nMessageLen = recv(hSocket,(char *)&Msg,sizeof(Msg),0);