您的位置:首页 > 理论基础 > 计算机网络

TCPAPI网络通信(一个服务器对一个…

2015-04-28 16:38 357 查看
服务器:





BOOL
CWinSockSeverApp::InitInstance()


{

 //extra code

  

 VERIFY(1==InitSkinMagicLib(AfxGetInstanceHandle(),NULL,NULL,NULL));

  VERIFY(1==LoadSkinFile("corona.smf"));


}

在WinSockSeverDlg.h中添加变量:

public:

 int GetCount();

 void SendToAll(SOCKET s,char *buff);

 SOCKET m_sock;

 ~CWinSockSeverDlg();

 SOCKET msgsock[50];

 int addlen;

 sockaddr_in serv;

 int count;


在WinSockSeverDlg.cpp

BOOL
CWinSockSeverDlg::OnInitDialog()


{

   //extra code

 
SetWindowSkin(  
m_hWnd  
,  
"Dialog"  
); 

 SetDialogSkin("Dialog");

 // TODO: Add extra initialization here

 count=1;

 m_listInfo.InsertString(0,"消息");

 

 for(int i=0;i<50;i++)

  msgsock[i]=NULL;

 serv.sin_addr.s_addr=htonl(INADDR_ANY);

 serv.sin_family=AF_INET;

 serv.sin_port=5000;

 addlen=sizeof(serv);

 m_button.EnableWindow(FALSE);

 m_sock=socket(AF_INET,SOCK_STREAM,0);

 if(bind(m_sock,(sockaddr*)&serv,addlen))

 {

  AfxMessageBox("绑定错误");

 }

 else

 {

  AfxMessageBox("服务器创建成功");

  listen(m_sock,5);

  AfxBeginThread(&Thread,0);

 }


}

 

void
CWinSockSeverDlg::OnButtonSend()

{

 

 char buff[100];

 m_edit.GetWindowText(buff,99);

 m_edit.SetWindowText(" ");

 

 

 CString str=buff;

 str="服务器:"+str;

 m_listInfo.InsertString(count++,str);

 

 for(int i=0;i<50;i++)

 {

  if(msgsock[i]!=NULL)

  {

   send(msgsock[i],buff,100,0);

  }

 }

}


 

UINT Thread(LPVOID
p)

{

 char buff[100];

 

 int s=1,msgcount,loop=1,flag=0;

 CWinSockSeverDlg  *dlg=(
CWinSockSeverDlg *)Afx
4000
GetApp()->GetMainWnd();

 msgcount=dlg->GetCount();

 if(msgcount==-1)

 {

  loop=0;

 }

 if(loop)

 {

  s=1;

  dlg->msgsock[msgcount]=accept(dlg->m_sock,(sockaddr
*)&(dlg->serv),&(dlg->addlen));

  if(dlg->msgsock[msgcount]==INVALID_SOCKET)

  {

   dlg->m_edit.SetWindowText("Error
accept");

  }

  else

  {

   AfxBeginThread(Thread,0);

   dlg->SetForegroundWindow();

   dlg->m_listInfo.InsertString(dlg->count++,"连接成功");

   dlg->m_listInfo.InsertString(dlg->count++,inet_ntoa(dlg->serv.sin_addr));

   

   dlg->m_button.EnableWindow(TRUE);

   while(SOCKET_ERROR!=s)

   {

    s=recv(dlg->msgsock[msgcount],buff,100,0);

    

    if(SOCKET_ERROR!=s)

     

    {buff[s]='\0';

    CString
str=buff;

    str="客户机:"+str;

    dlg->SetForegroundWindow();

     dlg->m_listInfo.InsertString(dlg->count++,str);

    

     

    // dlg->SendToAll(dlg->msgsock[msgcount],buff);

    }

   }

   send(dlg->msgsock[msgcount],"Disconnected",100,0);

   dlg->m_listInfo.InsertString(dlg->count++,"Disconnected");

   

   for(int
i=0;i<50;i++)

    if(dlg->msgsock[i]!=NULL)

     flag=1;

    if(flag!=1)

     dlg->m_button.EnableWindow(FALSE);

    closesocket(dlg->msgsock[msgcount]);

    

  }

 }

 

 

 AfxEndThread(0);

 return 0;

}


int
CWinSockSeverDlg::GetCount()

{

 for(int i=0;i<50;i++)

 {

  if(msgsock[i]==NULL)

   return
i;

 }

 return -1;

}


CWinSockSeverDlg::~CWinSockSeverDlg()

{

 for(int i=0;i<50;i++)

  if(msgsock[i]!=NULL)

   send(msgsock[i],"Disconnected",100,0);

}


用SkinMagic做对话框皮肤:

将SkinMagiclib.h,corona.smf
,SkinMagicTrial.lib,SkinMagicTrial.dll放在调试目录下


在工程-》设置->general->MFC
Foundation class选静态链接


客户机:





BOOL
CWinSockClientApp::InitInstance()

{


//extra
code


VERIFY( 1 ==
InitSkinMagicLib(AfxGetInstanceHandle(), NULL , NULL, NULL
));

VERIFY(1==LoadSkinFile("corona.smf"));

 }


在WinSockClientDlg.h中

public:

 ~CWinSockClientDlg();

 int count;

 sockaddr_in cli;

 SOCKET clisock;


WinSockClientDlg.cpp:

BOOL
CWinSockClientDlg::OnInitDialog()


{

 //  TODO: Add extra initialization
here
SetWindowSkin(  
m_hWnd  
,  
"Dialog"  
); 

  SetDialogSkin("Dialog");


 m_editMessage.SetLimitText(99);

 

 m_listInfo.InsertString(0,"消息");

 m_buttonSend.EnableWindow(FALSE);

 m_editIP.SetWindowText("127.0.0.1");

 count=1;

 return TRUE;


}

 

void
CWinSockClientDlg::OnButtonConnect()

{

 

 char ipaddress[35];

 m_editIP.GetWindowText(ipaddress,30);

 cli.sin_addr .s_addr=inet_addr(ipaddress);

 cli.sin_family =AF_INET;

 cli.sin_port=5000;

 clisock=socket(AF_INET,SOCK_STREAM,0);

 AfxBeginThread(Thread,0);

}


void
CWinSockClientDlg::OnButtonDisconnect()

{

 

 closesocket(clisock);


 

 

}


void
CWinSockClientDlg::OnButtonSend()

{

 

 char buff[100];

 

 m_editMessage.GetWindowText(buff,99);

 m_editMessage.SetWindowText(" ");

 CString str=buff;

 str="客户机:"+str;

 m_listInfo.InsertString(count++,str);

 

 send(clisock,buff,100,0);

}


UINT Thread(LPVOID)

{

 char buff[100];

 

 int s=1,addcount=0;

 CWinSockClientDlg *dlg=(CWinSockClientDlg
*)AfxGetApp()->GetMainWnd();

 dlg->m_buttonConnect.EnableWindow(FALSE);

 dlg->m_buttonDisConnect.EnableWindow(TRUE);

 if(connect(dlg->clisock,(sockaddr
*)&(dlg->cli),sizeof(dlg->cli)))

 {

  dlg->m_listInfo.InsertString(dlg->count++,"失败");

  return -1;

 }

 dlg->m_listInfo.InsertString(dlg->count++,"成功");

 dlg->m_buttonSend.EnableWindow(TRUE);

 dlg->SetForegroundWindow();

 while(s!=SOCKET_ERROR)

 {

  s=recv(dlg->clisock,buff,100,0);

  dlg->SetForegroundWindow();

  if(s!=SOCKET_ERROR)

  {

   buff[s]='\0';

   CString str =
buff;

   str="服务器:"+str;

   dlg->m_listInfo.InsertString(dlg->count++,str);

   

  }

  

 }

 send(dlg->clisock,"Disconnected",100,0);

 dlg->m_buttonConnect.EnableWindow(TRUE);

 dlg->m_buttonDisConnect.EnableWindow(FALSE);

 dlg->m_buttonSend
.EnableWindow(FALSE);

 closesocket(dlg->clisock);

 AfxEndThread(0);

 return 0;

 

}


void
CWinSockClientDlg::OnExit()

{

 

 closesocket(clisock);

 DestroyWindow();

}


recv()函数:如果套接为SOCK_STREAM,默认为阻塞式,直到数据到来前决不返回

accept函数是个阻塞函数,绝对的阻塞,没有客户端连接绝不返回:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐