高分请高手解决问题,解决立即给分!

207 2003-04-17 09:34:08
我这个程序是客户端的,编译通过了,一按连接按钮,就要终止了,请帮我看一下这进程写的是不是有问题,谢谢!
UINT thread(LPVOID v)
{
char buff[100];
//定义数组用来预保存一些服务器的IP地址
char ServerIp[5][30]=
{
"192.168.103.185",
"192.168.103.187",
"192.168.103.130",
"192.168.103.132",
"192.168.103.135"
};
CSize size;
size.cx=0;
size.cy=30;
int s=1,addcount=0;
//获得对话框,CChat是基于formview的
CChat *clichat=(CChat*) AfxGetApp()->GetMainWnd();

clichat->m_connect.EnableWindow(false);

clichat->m_disconnect.EnableWindow(true);
//连接服务器
while(connect(clichat->clisock,(sockaddr *)&(clichat->cli),sizeof(clichat->cli))&&clichat->ee!=0)
{
clichat->m_client_talk.SetWindowText("等待。。。");

//空循环
for(int i=0;i<=65000;i++)
for(int j=0;j<=200;j++);

if(addcount==25)
addcount=0;
//如果不能连接成功,则连接下一个地址
clichat->cli.sin_addr.s_addr=inet_addr(ServerIp[addcount++]);
}
//如果连接成功,则显示相关信息
if(clichat->ee==1)
clichat->m_client_list.InsertItem(clichat->count++,"连接成功!");
//设定发送按钮为可用状态
clichat->m_client_send.EnableWindow(true);
clichat->SetForegroundWindow();
//循环获得数据
while(s!=SOCKET_ERROR && clichat->ee!=0)
{
//调用recv函数接收数据
s=recv(clichat->clisock,buff,100,0);
clichat->SetForegroundWindow();
//如果没有发生错误同时没有断开连接,则显示接收到的数据
if(s!=SOCKET_ERROR && clichat->ee!=0)
clichat->m_client_list.InsertItem(clichat->count++,buff);
clichat->m_client_list.Scroll(size);
}
//如果发生错误,或者认为断开连接,发送断开命令
send(clichat->clisock,"Disconnected",100,0);
//设定相关控件属性
clichat->m_client_send.EnableWindow(false);
clichat->m_connect.EnableWindow(true);
clichat->m_disconnect.EnableWindow(false);
//关闭Socket
closesocket(clichat->clisock);
//终止该线程
AfxEndThread(0);
return 0;
}

...全文
96 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2003-04-18
  • 打赏
  • 举报
回复
try use static member function
207 2003-04-18
  • 打赏
  • 举报
回复
是不是这里出问题了,怎样解决呢?
//获得对话框,CChat是基于formview的
CChat *clichat=(CChat*) AfxGetApp()->GetMainWnd();

请指点,谢谢!
lblyy76 2003-04-17
  • 打赏
  • 举报
回复
要改变变量ee的值。
lblyy76 2003-04-17
  • 打赏
  • 举报
回复
陷入死循环了吧,你连接成功之后要改变
207 2003-04-17
  • 打赏
  • 举报
回复
我的连接按钮程序如下:
void CChat::OnConnect()
{
//定义变量以后以保存服务器地址
char Ipaddress[35];
//获得服务器地址
m_server_ip.GetWindowText(Ipaddress,30);
//设定Socket需要连接的地址
cli.sin_addr.s_addr=inet_addr(Ipaddress);
cli.sin_family=AF_INET;
//设定服务器端口
cli.sin_port=5000;
//创建Socket
clisock=socket(AF_INET,SOCK_STREAM,0);
ee=1;
//启动线程
AfxBeginThread(thread,0);
}
dgsrest 2003-04-17
  • 打赏
  • 举报
回复
我看ee是代表和服务器连接
1表示正与服务器连接吧
lblyy76 2003-04-17
  • 打赏
  • 举报
回复
首先我没发现你有改变ee值的代码,你开始就设定了ee的值为1,不管你以后连接成功与否,ee都是没意义的(可能你修改了没写出来)。最好一个地址对应一个创建的套接字,我没看到你创建,从CSocket派生新类CChatSocket,在主对话框中定义该类的私有变量,比如CChatSocket* m_pSocket;在对话框头文件开始处声明类class CChtaSocket;然后创建m_pSocket = new CChatSocket(this);增加判断:if(!m_pSocket->Create()){delete m_pSocket;m_pSocket=NULL;AfxMessageBox(".....");}
...........//你的代码
再连接服务器:
while(!m_pSocket->Connect(.....)){delete m_pSocket;m_pSocket = NULL;....;return FALSE;}
207 2003-04-17
  • 打赏
  • 举报
回复
当connect成功后,回返回0,就会退出连接的循环了。请再指教,谢谢!

18,356

社区成员

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

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