读书人

关于winsock通讯的VC小程序,该怎么处理

发布时间: 2012-05-20 16:03:12 作者: rapoo

关于winsock通讯的VC小程序
// MySockDlg.cpp : implementation file
//

#include "stdafx.h"
#include "MySock.h"
#include "MySockDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
/////////////////////////////////////////////////////////////////////////////
// CMySockDlg dialog

CMySockDlg::CMySockDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMySockDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMySockDlg)
m_strMessage = _T("");
m_iPort = 0;
m_strName = _T("");
m_iType = -1;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMySockDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMySockDlg)
DDX_Control(pDX, IDC_CHECK_HEXSEND, m_ctlHexSend);
DDX_Control(pDX, IDC_LRECV, m_ctlRecv);
DDX_Control(pDX, IDC_LSEND, m_ctlSend);
DDX_Control(pDX, IDC_BCONNECT, m_ctlConnect);
DDX_Text(pDX, IDC_EMSG, m_strMessage);
DDX_Text(pDX, IDC_EPORT, m_iPort);
DDX_Text(pDX, IDC_ESERVERNAME, m_strName);
DDX_Radio(pDX, IDC_RCLIENT, m_iType);
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMySockDlg, CDialog)
//{{AFX_MSG_MAP(CMySockDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BSEND, OnBsend)
ON_BN_CLICKED(IDC_BCLOSE, OnBclose)
ON_BN_CLICKED(IDC_RCLIENT, OnRType)
ON_BN_CLICKED(IDC_RSERVER, OnRType)
ON_BN_CLICKED(IDC_BCONNECT, OnBconnect)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMySockDlg message handlers

BOOL CMySockDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);// Set big icon
SetIcon(m_hIcon, FALSE);// Set small icon

// TODO: Add extra initialization here
// 初始化控件对应的变量
m_iType = 0;
m_strName ="59.68.185.188";
m_iPort = 2111;
// 更新控件
UpdateData(FALSE);
// 设置Socket 对应的对话框
m_sConnectSocket.SetParent(this);
m_sListenSocket.SetParent(this);
return TRUE; // return TRUE unless you set the focus to a control
}

void CMySockDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CMySockDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);


CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMySockDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

void CMySockDlg::OnBsend()
{

// TODO: Add your control notification handler code here
OnSend();
}

void CMySockDlg::OnBclose()
{
// TODO: Add your control notification handler code here
OnClose();
}

void CMySockDlg::OnRType()
{

// TODO: Add your control notification handler code here
UpdateData(TRUE); //使控件与变量同步
if(m_iType==0) //m_iType=0 即client端
m_ctlConnect.SetWindowText(" 连接");//m_ctlConnect 为控件“连接”按钮的映射变量
else
m_ctlConnect.SetWindowText(" 监听");

}

void CMySockDlg::OnBconnect()
{
// TODO: Add your control notification handler code here
// 使变量与控件同步
UpdateData(TRUE);
// 使连接和类型控件无效
GetDlgItem(IDC_BCONNECT)->EnableWindow(FALSE);
GetDlgItem(IDC_ESERVERNAME)->EnableWindow(FALSE);
GetDlgItem(IDC_EPORT)->EnableWindow(FALSE);
GetDlgItem(IDC_RCLIENT)->EnableWindow(FALSE);
GetDlgItem(IDC_RSERVER)->EnableWindow(FALSE);
// 作为客户端还是服务器端?
if(m_iType == 0)
{
m_sConnectSocket.Create();// 客户端,则创建缺省的 Socket
m_sConnectSocket.Connect(m_strName,m_iPort);// 打开与服务器的连接
}
else
{
m_sListenSocket.Create(m_iPort);// 服务器端,则创建一个与制定端口号相关联的socket
m_sListenSocket.Listen();//监听连接请求
}
}

void CMySockDlg::OnAccept()
{
// 接受连接请求
m_sListenSocket.Accept(m_sConnectSocket);
// 是文本和消息控件有效
GetDlgItem(IDC_EMSG)->EnableWindow( TRUE);
GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
GetDlgItem(IDC_SMSG)->EnableWindow(TRUE);
GetDlgItem(IDC_BCLOSE)->EnableWindow(TRUE);
}

void CMySockDlg::OnConnect()
{
// 使文本和消息控件有效
GetDlgItem(IDC_EMSG)->EnableWindow( TRUE);
GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
GetDlgItem(IDC_SMSG)->EnableWindow(TRUE);
GetDlgItem(IDC_BCLOSE)->EnableWindow(TRUE);
}

void CMySockDlg::OnSend()
{
if(m_ctlHexSend.GetCheck())
{

int iSent;
UpdateData(TRUE);
CByteArray data1;
int len=String2Hex(m_strMessage,data1); //此处返回的len可以用于计算发送了多少个十六进制数
//MessageBox(m_strMessage,NULL,1);
//printf(%s,data1);
iSent = m_sConnectSocket.Send(COleVariant(data1),len);
//m_sConnectSocket.Send(COleVariant(data1),len);
//m_strName.SetOutput(COleVariant(m_strMessage)); //发送十六进制数据
//m_ctlSend.AddString(COleVariant(data));
if(iSent == SOCKET_ERROR)//是否发送成功
{
// 错误处理代码
}
else
{
// 把消息添加到已发送列表中
m_sConnectSocket.Send(LPCSTR(m_strMessage),len);
m_ctlSend.AddString(m_strMessage);
// 把控件与变量同步
UpdateData(FALSE);
}
//m_ctlSendSocket.SendStr(m_message);

}
else

{
int iLen;
int iSent;

// 使控件与变量同步
UpdateData(TRUE);
// 是否有信息要发送?
if(m_strMessage != "")
{
// 获取消息的长度


iLen = m_strMessage.GetLength();
// 发送消息
iSent = m_sConnectSocket.Send(LPCSTR(m_strMessage),iLen);
if(iSent == SOCKET_ERROR)//是否发送成功
{
// 错误处理代码
}
else
{
// 把消息添加到已发送列表中
m_ctlSend.AddString(m_strMessage);
// 把控件与变量同步
UpdateData(FALSE);
}
}



}


}

void CMySockDlg::OnReceive()
{
char *pBuf = new char[1025];
int iBufSize = 1024;
int iRcvd;
CString strRecv;
// 接收消息
iRcvd = m_sConnectSocket.Receive(pBuf,iBufSize);
if(iRcvd == SOCKET_ERROR)
{
// 错误处理代码
}
else
{
pBuf[iRcvd] = NULL;// 对信息进行结尾处理
strRecv = pBuf;// 复制接收到的消息CString类型的变量中
m_ctlRecv.AddString(strRecv);//增加信息到接收的列表框中
UpdateData(FALSE);//使变量与控件同步
}
}

void CMySockDlg::OnClose()
{
// 关闭连接socket
m_sConnectSocket.Close();
// 进制消息发送控件
GetDlgItem(IDC_EMSG)->EnableWindow(FALSE);
GetDlgItem(IDC_BSEND)->EnableWindow(FALSE);
GetDlgItem(IDC_SMSG)->EnableWindow(FALSE);
GetDlgItem(IDC_BCLOSE)->EnableWindow(FALSE);

if(m_iType == 0)// 客户端模式
{
// 若是客户端模式,则要使与连接相关的控件有效
GetDlgItem(IDC_BCONNECT)->EnableWindow(TRUE);
GetDlgItem(IDC_ESERVERNAME)->EnableWindow(TRUE);
GetDlgItem(IDC_EPORT)->EnableWindow(TRUE);

GetDlgItem(IDC_RCLIENT)->EnableWindow(TRUE);
GetDlgItem(IDC_RSERVER)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC)->EnableWindow(TRUE);
}
}

int CMySockDlg::String2Hex(CString str, CByteArray &senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();
senddata.SetSize(len/2);
for(int i=0;i<len;)
{
char lstr,hstr=str[i];
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;
}


char CMySockDlg::ConvertHexChar(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return (-1);
}





小弟想做一个类似于TCP调试助手的软件,现在编译运行都没有语法错误。当以字符串发送时,也就是不选十六进制复选框,程序运行一切都好。当需要以十六进制发送时,就出现了乱码的情况。希望大家能帮我看看到底出现什么问题了。我的QQ2676718256 有愿意帮助我的可以加我QQ,我可以吧程序发送给你看看。谢谢各位了。

[解决办法]
你好歹把你乱码的样子发给我们看一下
[解决办法]
char转换为十六进制
一个char字符可以转换为两个十六进制吧
也就是说你转换的方法有问题 要通过位操作来实现
我的建议
[解决办法]
一个string2hex要写这么多代码???
[解决办法]
接收处的代码是怎么样的?


[解决办法]
这代码 怎么看着很乱 整理一下吧


[解决办法]
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!

读书人网 >C++

热点推荐