一个莫名奇妙的问题!

tjjccnu 2005-01-06 11:11:36
所有的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想把这些信息发给某一个client

for (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;
此句总是通不过,为什么啊,急!

是不是涉及到进程之间通信的问题呢?

...全文
164 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hopen 2005-01-08
  • 打赏
  • 举报
回复
我觉得pclili(黑客天使)说的对,首先你不要用CString类来发送消息,修改为char定长的数组
要注意修改后服务器端存储的时候要用strcpy,直接等于会有问题
tjjccnu 2005-01-08
  • 打赏
  • 举报
回复
贴出书上的一点东西,大家共同学习!

必须牢牢记住这一点:所有关系到收发数据的缓冲都属于简单的c h a r类型。也就是说,这
些函数没有“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码。
tjjccnu 2005-01-08
  • 打赏
  • 举报
回复
问题似乎找到了,可能是因为我发送的的数据太长了,一次recv()接收不完,于是接收了两次!
第二次的时候,没有处理,而另外一个进程也recv()正好访问同一个地址空间,于是出现错误!
把char mText[1024]中的1024改成512,问题好象解决了!

但是客户端好象不能协调工作,也就是同时多开几个客户端时,相互和server通信,好象总有个别客户端出错,难道这就是tcp的原因?
tjjccnu 2005-01-08
  • 打赏
  • 举报
回复
这个我也试过了,换strcpy也不行,会不会是两个线程同时访问同一个地址的数据造成冲突呢?
oyljerry 2005-01-08
  • 打赏
  • 举报
回复
数组用定长的char []
拷贝用strcpy或memcpy
pclili 2005-01-07
  • 打赏
  • 举报
回复
他的TName好象是CString的,发送结构的时候不能用这个类型吧。
用char TName[128];这样的。
CString是动态分配的,所以结构的大小不定。
发送会有问题
pclili 2005-01-07
  • 打赏
  • 举报
回复
UserInfo是怎么定义的,肯定是这个的问题。
你把定义贴出来看看。
再告诉你怎么做
双杯献酒 2005-01-07
  • 打赏
  • 举报
回复
Name是CString还是char* ?
delphihero 2005-01-07
  • 打赏
  • 举报
回复
RecvMess[j] 是传递的引用还是值
tjjccnu 2005-01-07
  • 打赏
  • 举报
回复
struct User UserInfo[MAXClient]; 定义在doc类的头文件里!
tjjccnu 2005-01-07
  • 打赏
  • 举报
回复
呵呵,这里的TName是string定义的!
发送结构的时候,强制转换了,而且只有一个客户端的时候完全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 6

struct 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
tjjccnu 2005-01-07
  • 打赏
  • 举报
回复
传的时候是地址,强制转换成(char *),但应该不是这个问题!
tjjccnu 2005-01-06
  • 打赏
  • 举报
回复
呵呵,这个都不是问题啦!
mahatma_cn 2005-01-06
  • 打赏
  • 举报
回复
j是否等于或者大于MAXClient?
tjjccnu 2005-01-06
  • 打赏
  • 举报
回复
对!是数组,在构造函数中初始化的!

for(int i = 0; i < MAXClient; i++)
{
UserInfo[i].TName = "";
UserInfo[i].IPAddr = 1;
UserInfo[i].Port = 1;
}
双杯献酒 2005-01-06
  • 打赏
  • 举报
回复
UserInfo是怎么初始化的?
是不是数组?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧