自己写了一个socket通信服务器,服务器可以收到客户端的数据,但无法向客户端发送数据,单步执行到SendMsg时停在return -1,发送错误

玻璃花的秋天 发布于 2016/09/29 08:06
阅读 367
收藏 0

基于对话框的函数为



// ServerSoDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "ServerSo.h"
#include "ServerSoDlg.h"
#include "ServerSocket.h"
#include "afxdialogex.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif




// 用于应用程序“关于”菜单项的 CAboutDlg 对话框


class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();


// 对话框数据
enum { IDD = IDD_ABOUTBOX };


protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持


// 实现
protected:
DECLARE_MESSAGE_MAP()
};


CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}


void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()




// CServerSoDlg 对话框








CServerSoDlg::CServerSoDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CServerSoDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_SendData = _T("");
}


void CServerSoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_Exit, m_Exit);
DDX_Control(pDX, IDC_Send, m_Send);
DDX_Text(pDX, IDC_SendData, m_SendData);
DDX_Control(pDX, IDC_ShowText, m_ShowText);
DDX_Control(pDX, IDC_StartServer, m_StartServer);
}


BEGIN_MESSAGE_MAP(CServerSoDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_StartServer, &CServerSoDlg::OnBnClickedStartserver)
ON_BN_CLICKED(IDC_Exit, &CServerSoDlg::OnBnClickedExit)
ON_BN_CLICKED(IDC_Send, &CServerSoDlg::OnBnClickedSend)
END_MESSAGE_MAP()




// CServerSoDlg 消息处理程序


BOOL CServerSoDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();


// 将“关于...”菜单项添加到系统菜单中。


// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);


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


// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标


// TODO: 在此添加额外的初始化代码


return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}


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


// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。


void CServerSoDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文


SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);


// 使图标在工作区矩形中居中
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;


// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}


//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CServerSoDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}










void CServerSoDlg::OnBnClickedStartserver()
{
// TODO: 在此添加控件通知处理程序代码
UINT m_Port=8001;
    listenSocket = NULL;
    listenSocket = new CServerSocket();
    listenSocket->m_pDlg = this;
// 指定对话框为主对话框
    UpdateData(true);
m_ShowText.AddString ("服务器开始创建socket!");
m_ShowText.AddString ("服务器端口8001!");
    if (!listenSocket->Create(m_Port))                     
// 创建服务器的套接字,IP地址默认本机IP
    {
m_ShowText.AddString ("创建套接字错误!");
            listenSocket->Close();
            return;
    }
   if (!listenSocket->Listen())
   {
m_ShowText.AddString ("监听失败!");
         listenSocket->Close();
         return;
    }
    m_connect = true;
}


void CServerSoDlg::AddClient()
{
   CServerSocket *pSocket = new CServerSocket;
         pSocket->m_pDlg = this;
         listenSocket->Accept(*pSocket);
         pSocket->AsyncSelect(FD_READ | FD_WRITE | FD_CLOSE);
         m_clientList.AddTail(pSocket);
         UpdateData(false);
m_ShowText.AddString ("服务器绑定成功!");
}




void CServerSoDlg::RecvData(CServerSocket* pSocket)
{
         char* pData = NULL;
         pData = new char[1024];
         memset(pData, 0, sizeof(char)* 1024);
         UCHAR leng = 0;
         CString str;
         if (pSocket->Receive(pData, 1024, 0) != SOCKET_ERROR)
         {
                   str = pData;
  m_ShowText.AddString(str);
                   Control(str);     // 依据指令控制
         }
         delete pData;
         pData = NULL;
}




BOOL CServerSoDlg::WChar2MByte(LPCWSTR srcBuff, LPSTR destBuff, int nlen)
{
         int n = 0;
         n = WideCharToMultiByte(CP_OEMCP, 0, srcBuff, -1, destBuff, 0, 0, FALSE);
         if (n<nlen)return FALSE;
         WideCharToMultiByte(CP_OEMCP, 0, srcBuff, -1, destBuff, nlen, 0, FALSE);
         return TRUE;
}






void CServerSoDlg::Control(CString Control)
{
         if (Control == "mop")             
         {
         ShellExecute(NULL, _T("open"), _T("C:\\Program Files (x86)\\KuGou\\KGMusic\\KuGou.exe"), NULL, NULL, SW_SHOWNORMAL);
         }
         else if (Control == "mcl")        
         {
                   DWORD id_num;
                   HWND hWnd = ::FindWindow(_T("kugou_ui"), NULL);
                   GetWindowThreadProcessId(hWnd, &id_num);                      
//注意:第二个参数是进程的ID,返回值是线程的ID。
                   HANDLE hd = OpenProcess(PROCESS_ALL_ACCESS, FALSE, id_num);
                   TerminateProcess(hd, 0);
         }
         else if (Control == "mpl" || Control == "mpa")           
         {
                   keybd_event(VK_LMENU, 0, 0, 0);
                   keybd_event(VK_F5, 0, 0, 0);
                   keybd_event(VK_F5, 0, KEYEVENTF_KEYUP, 0);
                   keybd_event(VK_LMENU, 0, KEYEVENTF_KEYUP, 0);
         }
}








void CServerSoDlg::OnBnClickedExit()
{
// TODO: 在此添加控件通知处理程序代码
OnOK();
}




void CServerSoDlg::OnBnClickedSend()
{
// TODO: 在此添加控件通知处理程序代码
if(!m_StartServer)
return;
UpdateData(true);                                     
    if(m_SendData != "")                                           
    {
        char* pBuff = new char(m_SendData.GetLength()); 
        memset(pBuff, 0, m_SendData.GetLength());  //内存段清
        WChar2MByte((LPCWSTR)m_SendData.GetBuffer(0), pBuff, m_SendData.GetLength());
        listenSocket->SendMSG(pBuff, m_SendData.GetLength()); 
    }
}









添加CSocket类的ServerSocket.cpp的程序为

// ServerSocket.cpp : 实现文件
//


#include "stdafx.h"
#include "resource.h"
#include "ServerSo.h"
#include "ServerSocket.h"
#include "ServerSoDlg.h"






// CServerSocket


CServerSocket::CServerSocket()
{

}


CServerSocket::~CServerSocket()
{
}




// CServerSocket 成员函数


void CServerSocket::OnAccept(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
m_pDlg->AddClient();  
CSocket::OnAccept(nErrorCode);
}




void CServerSocket::OnReceive(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
m_pDlg->RecvData(this); 
CSocket::OnReceive(nErrorCode);
}


//发送数据给客户端


BOOL CServerSocket::SendMSG(LPSTR lpBuff,int nlen)
{
if (Send(lpBuff, nlen) == SOCKET_ERROR)
    {
         int nErrorCode=WSAGetLastError();
if(nErrorCode==WSAETIMEDOUT||nErrorCode==WSAECONNABORTED||nErrorCode==WSAEHOSTUNREACH||nErrorCode==WSAESHUTDOWN)
    return 0;
else
return -1; //错误   
     }
         return  TRUE;
  
}


加载中
0
刘大神
刘大神
把你用WSAGetLastError 获取到的错误码,查一下错误码的意思, 看看都有什么情况导致这样的错误发生,你这返回-1什么都说明不了
0
大梦1107
大梦1107
这样问问题,还好是个妹子。
0
无锡首席大都督程序员

好歹markdown一下吧

看的眼花啊

返回顶部
顶部