TCP/IP通信(客户端)

来源:互联网 发布:软件license管理方法 编辑:程序博客网 时间:2024/05/18 01:24

建立对话框。再建立一个IP设置的对话框,并添加类GetIP,基类是CDialog。然后添加链接(确定)的消息响应virtual void OnOK();再添加WM_INITDIALOG的消息响应。然后关联变量给IP地址框CIPAddressCtrl m_ip。定义变量CString ipstr;添加初始化代码ipstr=_T("");OnOK()函数中添加 m_ip.GetWindowText(ipstr); //获取IP地址。OnInitDialog() 函数中m_ip.SetWindowText(ipstr)。在头文件中包含添加对话框的头文件#include "GetIP.h"。

StdAfx.h中添加代码
包含头文件 #include <afxsock.h>  // MFC socket extensions


#define WM_CLIENT_READCOLOSE WM_USER + 101

typedef struct ZyMsg
{
 char msg[100];
 int i;
}Msg;

头文件中定义变量
 SOCKET ServerSocket;             //SOCKET
 SOCKADDR_IN sockStruct;          //SOCKET 结构

 BOOL BindOK;
 Msg msg;
GetIP类中添加

对话框中添加连接和发送函数代码

void CClientDlg::OnOK()   //连接
{
 // TODO: Add your control notification handler code here
 LPCTSTR ip;
 GetIP add;
 
 add.ipstr= _T("218.196.255.208");
 if(add.DoModal() == IDOK)
 {
  if(add.ipstr.IsEmpty())
  {
   MessageBox("没有输入IP地址!");
   return;
  }
  else
  {
   ip=add.ipstr;   //获取对话框中的IP
  }
 }
 else
 {
  return;
 }
 

 WSADATA wsaData;
 if(WSAStartup(MAKEWORD(2,1),&wsaData))  //调用Windows Sockets DLL
 {
  MessageBox("Winsock无法初始化!");
  WSACleanup();
  return;
 }
 m_rxdata+="/n服务器开始创建SOCKET!";
 UpdateData(FALSE);  //将变量内容更新至编辑框


 ServerSocket=socket(PF_INET,SOCK_STREAM,0);    //创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信
 
 if(INVALID_SOCKET == ServerSocket)
 {
  MessageBox("无法创建服务器socket!");
  return;
 }

 m_rxdata+="服务器端口:8001";
 UpdateData(FALSE);  //将变量内容更新至编辑框

 DWORD dwip;
 if((dwip=inet_addr(ip))==INADDR_NONE)
 {
  MessageBox("IP赋值错误");
  return;
 }
    sockStruct.sin_family=AF_INET; //使用TCP/IP协议
    sockStruct.sin_port = htons(8001);
 sockStruct.sin_addr.S_un.S_addr = dwip;

 if(SOCKET_ERROR == connect(ServerSocket,(LPSOCKADDR)&sockStruct,sizeof(sockStruct)))
 {
  MessageBox("无法连接服务器。");
  return;
 }

 else
 {
  char *buf=new char[100];
  strcpy(buf,"工作站连接成功——发送数据到服务器");
  send(ServerSocket,buf,100,0);
  delete buf;
 }
 
 WSAAsyncSelect(ServerSocket,m_hWnd,WM_CLIENT_READCOLOSE,FD_READ|FD_CLOSE);
         // 产生相应传递给窗口的消息为WM_SERVER_ACCEPT ,这是自定义消息

 m_rxdata+="连接服务器成功!";
 UpdateData(FALSE);  //将变量内容更新至编辑框
 m_rxdata+=("IP地址:"+add.ipstr);
 UpdateData(FALSE);  //将变量内容更新至编辑框

 BindOK=TRUE;
 return;

}

void CClientDlg::OnSend()  //发送
{
 // TODO: Add your control notification handler code here
 if(!BindOK)
 {
  m_rxdata+="服务器还没有连接呢@!";
  UpdateData(FALSE);  //将变量内容更新至编辑框
  return;
 }
 
 UpdateData(TRUE); //将编辑框内容更新至变量
 if(m_txdata.IsEmpty())
 {
  m_rxdata+="发送的字符串不能为空!";
  UpdateData(FALSE);  //将变量内容更新至编辑框
  return;
 }

 strcpy(msg.msg,(LPCTSTR)m_txdata);
 msg.i=0;
 if(send(ServerSocket,(char *)&msg,sizeof(msg),0) == SOCKET_ERROR)// recv(ServerSocket,buf,sizeof(buf),0);
 {
  m_rxdata+="发送数据发生错误。";
  UpdateData(FALSE);  //将变量内容更新至编辑框
  return;
 }
 else
 {
  m_rxdata+=m_txdata;
 }

 m_txdata.Empty();
 UpdateData(FALSE);  //将变量内容更新至编辑框
 ((CEdit *)GetDlgItem(IDC_EDIT2))->SetActiveWindow();
}
添加消息映射函数

BOOL CClientDlg::DestroyWindow()
{
 // TODO: Add your specialized code here and/or call the base class
 WSACleanup();
 return CDialog::DestroyWindow();
}
手动添加接收消息映射
头文件 LRESULT OnReadClose(WPARAM wParam,LPARAM lParam);
源文件  ON_MESSAGE(WM_CLIENT_READCOLOSE,OnReadClose)

/********************接收数据***************************/

LRESULT CClientDlg::OnReadClose(WPARAM wParam,LPARAM lParam)
{
 char *buf = new char[100];
 CString str;
 switch (WSAGETSELECTEVENT(lParam))
 {
 case FD_READ:
  if(recv(ServerSocket,(char *)&msg,sizeof(msg),0) == SOCKET_ERROR)
  {
   m_rxdata+="接收数据发生错误。"; 
   return 0L;
  }
  str.Format("%s",msg.msg);
  m_rxdata+=str;  //接收数据
  UpdateData(FALSE);  //将变量内容更新至编辑框
  break;
 case FD_CLOSE:
  closesocket(ServerSocket);
  m_rxdata+="服务器退出。";
  UpdateData(FALSE);  //将变量内容更新至编辑框
  BindOK = FALSE;
  break;
 }
 return 0L;
}

原创粉丝点击