所有的client登陆到server中,登陆时发送client的信息,包括用户名和ip和port!
m_pDoc->UserInfo[i].Name = RecvMess[i].Name;
m_pDoc->UserInfo[i].IPAddr = RecvMess[i].IPAddr;
m_pDoc->UserInfo[i].Port = RecvMess[i].Port;
m_pDoc->UpdateAllViews(NULL, 0L, 0);RecvMess[i] 是接收到的信息,UserInfo[i]是server端保存的用户信息,保存在mfc的doc类中!然后server想把这些信息发给某一个clientfor (int j = 0; j < MAXClient; j++)
{
if(m_aClientSocket[j] != INVALID_SOCKET)
{
m_pDoc = GetDocument();
RecvMess[j].Name = m_pDoc->UserInfo[j].Name;
RecvMess[j].IPAddr = m_pDoc->UserInfo[j].IPAddr;
RecvMess[j].Port = m_pDoc->UserInfo[j].Port; int iErrorCode = send ( m_aClientSocket[i], (char *)&RecvMess[j], // 发给客户端i
sizeof(RecvMess[j]), NO_FLAGS);
if (iErrorCode == SOCKET_ERROR)
ReportWinsockErr("客户端没有响应");
}
}问题来了,当只有一个客户端登陆时,完全ok!
但是当两个客户端登陆时,就总是说内存无法访问?(对于不同的客户端用不同的socket连接tcp)
断点调试
RecvMess[j].Name = m_pDoc->UserInfo[j].Name;
此句总是通不过,为什么啊,急!是不是涉及到进程之间通信的问题呢?
m_pDoc->UserInfo[i].Name = RecvMess[i].Name;
m_pDoc->UserInfo[i].IPAddr = RecvMess[i].IPAddr;
m_pDoc->UserInfo[i].Port = RecvMess[i].Port;
m_pDoc->UpdateAllViews(NULL, 0L, 0);RecvMess[i] 是接收到的信息,UserInfo[i]是server端保存的用户信息,保存在mfc的doc类中!然后server想把这些信息发给某一个clientfor (int j = 0; j < MAXClient; j++)
{
if(m_aClientSocket[j] != INVALID_SOCKET)
{
m_pDoc = GetDocument();
RecvMess[j].Name = m_pDoc->UserInfo[j].Name;
RecvMess[j].IPAddr = m_pDoc->UserInfo[j].IPAddr;
RecvMess[j].Port = m_pDoc->UserInfo[j].Port; int iErrorCode = send ( m_aClientSocket[i], (char *)&RecvMess[j], // 发给客户端i
sizeof(RecvMess[j]), NO_FLAGS);
if (iErrorCode == SOCKET_ERROR)
ReportWinsockErr("客户端没有响应");
}
}问题来了,当只有一个客户端登陆时,完全ok!
但是当两个客户端登陆时,就总是说内存无法访问?(对于不同的客户端用不同的socket连接tcp)
断点调试
RecvMess[j].Name = m_pDoc->UserInfo[j].Name;
此句总是通不过,为什么啊,急!是不是涉及到进程之间通信的问题呢?
是不是数组?
{
UserInfo[i].TName = "";
UserInfo[i].IPAddr = 1;
UserInfo[i].Port = 1;
}
你把定义贴出来看看。
再告诉你怎么做
用char TName[128];这样的。
CString是动态分配的,所以结构的大小不定。
发送会有问题
发送结构的时候,强制转换了,而且只有一个客户端的时候完全ok!
为什么当第二个客户端连接上时,就总是无法读去呢?奇怪!#ifndef tini_2005_1_header_h#define tini_2005_1_header_h#define CTOS 0
#define STOC 1
#define CTOC 2
#define BROD 3#define CTOSReg 4
#define CTOSRef 5
#define STOCRef 6struct sendMessage
{
int iMessageType;
u_short Port;
CString Name;
DWORD IPAddr;
union _message
{
char mText[1024];
char mCtrl;
}message;};struct User
{
CString Name;
DWORD IPAddr;
u_short Port;
};#endif
要注意修改后服务器端存储的时候要用strcpy,直接等于会有问题
拷贝用strcpy或memcpy
第二次的时候,没有处理,而另外一个进程也recv()正好访问同一个地址空间,于是出现错误!
把char mText[1024]中的1024改成512,问题好象解决了!但是客户端好象不能协调工作,也就是同时多开几个客户端时,相互和server通信,好象总有个别客户端出错,难道这就是tcp的原因?
些函数没有“U n i c o d e”版本。这一点对Windows CE来说尤为重要,因为Windows CE默认使
用U n i c o d e。使用U n i c o d e时有一种选择,即把字符串当作c h a r *或把它造型为c h a r *发送。需要
注意的是,在利用字符串长度函数告诉Winsock API函数收发的数据有多少字符时,必须将这
个值乘以2,因为每个字符占用字串组的两个字节。另一种选择是在将字串数据投给Wi n s o c k
A P I函数之前,用Wi d e C h a r To M u l t i B y t e把U N I C O D E转换成A S C I I码。