各位大侠帮忙看看下面的代码,实质就是两个SOCKET同时通信的问题,框架是一个基于对话框的程序。
void MyInit()
{
serv.sin_addr.s_addr=htonl(INADDR_ANY);
serv.sin_family=AF_INET;
serv.sin_port=5000;//htons(5000);
addlen=sizeof(serv);
//创建socket
sock=socket(AF_INET,SOCK_STREAM,0);
//绑定
if (bind(sock,(sockaddr*)&serv,addlen))
{
MessageBox("绑定错误");
}
else
{
//开始侦听    
listen(sock,5);
//调用线程
AfxBeginThread(&thread,0);
}
}
UINT thread(LPVOID p)
{
char buff[100];
CString temp,temp1("Start");
    
Display *dlg=(Display*)AfxGetApp()->GetMainWnd();dlg->sersock=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen));
if (dlg->sersock==INVALID_SOCKET)
{
AfxMessageBox("INVALID_SOCKET");
}
else
{
int result=1;
while(result!=SOCKET_ERROR)
{
result=recv(dlg->sersock,buff,100,0);
if (result!=SOCKET_ERROR)
{
temp=buff;
if(temp == temp1)
  fun1();//全局函数
}
}
}
closesocket(dlg->sersock);
                
AfxEndThread(0);
return 0;
}
void fun1()
{
int i=0;
sockaddr_in cli;
SOCKET clisock;
cli.sin_addr.s_addr=inet_addr("198.118.60.45");
cli.sin_family=AF_INET;
cli.sin_port=1051;//htons(5000);
clisock=socket(AF_INET,SOCK_STREAM,0);    
while(connect(clisock,(sockaddr*)&(cli),sizeof(cli)))
{
if(i==5)
{
AfxMessageBox("不能连接到服务器");
return;
}
++i;
}
}
想作的这个程序本身既是服务器又是客户端,测试的时候是通过另外的一个程序先连接这个程序发出Start的指令,然后本程序去连接另外的一个服务器A(已经处于启动的状态)。为什么连接不上A啊?如果不等待指令而是直接去连A则成功,原因是什么?

解决方案 »

  1.   

    我也正想做类似的程序,我想用flag来保存是客户端还是服务器的信息,正在试验中.同进希望楼主成功后能让我们分享.
      

  2.   

    结构很乱啊
    看是不是运行到了fun1里面啦。看fun1里面的connect返回的错误码是什么啦。
      

  3.   

    MyInit()中增加:
    WSADATA WSAData;
    if(WSAStartup(MAKEWORD(2,2),&WSAData)){
    printf("WSA start error!");
    ExitProcess(0);
    }
    另外:
    serv.sin_addr.s_addr=htonl(INADDR_ANY);
    serv.sin_family=AF_INET;
    serv.sin_port=5000;//htons(5000);
    前面要加:
    ZeroMemery(&serv,sizeof(serv));
    //cli也一样!
      

  4.   

    每一个线程都需要:WSAStartup(MAKEWORD(2,2),&WSAData)
      

  5.   

    每个线程里面都加上了SOCKET的初始化但是还是连接不上
      

  6.   

    to jingjing8178(晶晶) :
    只须调用一次就可以了!