REMOVE DLLCHR.Add TCP/IP COMM.

This commit is contained in:
TAO Cheng
2014-10-29 16:55:31 +08:00
parent d9932e709c
commit 02f1c7e503
12 changed files with 524 additions and 47 deletions
@@ -0,0 +1,169 @@
#include "StdAfx.h"
#include <WinDef.h>
#include <WinBase.h>
#include "So7_TCPIP.h"
const int WSA_MAJOR_VERSION = 1;
const int WSA_MINOR_VERSION = 1;
#define WSA_VERSION MAKEWORD(WSA_MAJOR_VERSION, WSA_MINOR_VERSION)
#define SOCKADDR_LEN sizeof(SOCKADDR_IN)
//================================================================
CSo7_TCPIP::CSo7_TCPIP()
{
m_socket=INVALID_SOCKET;
m_pszNetworkAddr="127.0.0.1";
m_nPortNumber=8000;
m_bDisableTimeout=false;
}
//================================================================
CSo7_TCPIP::~CSo7_TCPIP()
{
//DisConnect();
}
//================================================================
int CSo7_TCPIP::Init_Winsock()
{
int nRet;
static int first = TRUE;
if (first)
{
WSADATA stWSAData; /* WinSock DLL Info */
nRet = WSAStartup(WSA_VERSION, &stWSAData);
if (nRet)
{
return FALSE;
}
first = FALSE;
}
return TRUE;
}
//================================================================
TCPIP_RETURN_CODE CSo7_TCPIP::Connect()
{
TCPIP_RETURN_CODE rCode=TCPIP_CONNECT_OK;
//DisConnect();
int retVal(0), errorCode(0);
retVal=Init_Winsock();
if(!retVal)
{
return TCPIP_INIT_WINSOCK_ERROR;
}
// 创建套节字
m_socket = socket(AF_INET, SOCK_STREAM, 0);
if(m_socket == INVALID_SOCKET)
{
rCode=TCPIP_INVAILD_SOCKET;
}
else
{
// 设置socket为窗口通知消息类型
::WSAAsyncSelect(m_socket, m_hMsgWnd,
WM_SOCKET, FD_CONNECT | FD_CLOSE | FD_WRITE | FD_READ);
// 假定szAddr是IP地址
ULONG uAddr = inet_addr(m_pszNetworkAddr);
if(uAddr == INADDR_NONE)
{
// 不是IP地址,就认为这是主机名称
// 从主机名取得IP地址
hostent* pHost = ::gethostbyname(m_pszNetworkAddr);
if(pHost == NULL)
{
closesocket(m_socket);
m_socket = INVALID_SOCKET;
return TCPIP_INVAILD_SOCKET;
}
// 得到以网络字节顺序排列的IP地址
uAddr = ((struct in_addr*)*(pHost->h_addr_list))->s_addr;
}
// 填写服务器地址信息
sockaddr_in remote;
remote.sin_addr.S_un.S_addr = uAddr;
remote.sin_family = AF_INET;
remote.sin_port = htons(m_nPortNumber);
// 连接到远程机
retVal=connect(m_socket, (sockaddr*)&remote, sizeof(sockaddr));
if(retVal)
{
errorCode = WSAGetLastError();
rCode=(TCPIP_RETURN_CODE)errorCode;
}
}
return rCode;
}
//================================================================
TCPIP_RETURN_CODE CSo7_TCPIP::DisConnect()
{
if(m_socket == INVALID_SOCKET)
{
return TCPIP_INVAILD_SOCKET;
}
::closesocket(m_socket);
m_socket = INVALID_SOCKET;
return TCPIP_CONNECT_OK;
}
//================================================================
TCPIP_RETURN_CODE CSo7_TCPIP::Send()
{
if(m_socket == INVALID_SOCKET)
{
return TCPIP_INVAILD_SOCKET;
}
BYTE bSendData[20]={1,2,3,4,5};
int iSendDataLength=20;
if(::send(m_socket,(const char*)(bSendData),iSendDataLength,0) != -1)
{
return TCPIP_CONNECT_OK;
}
return TCPIP_CONNECT_OK;
}
//================================================================
TCPIP_RETURN_CODE CSo7_TCPIP::Recv()
{
if(m_socket == INVALID_SOCKET)
{
return TCPIP_INVAILD_SOCKET;
}
return TCPIP_CONNECT_OK;
}
//================================================================
LRESULT CSo7_TCPIP::OnSocket(WPARAM wParam, LPARAM lParam)
{
// 取得有事件发生的套节字句柄
SOCKET s = wParam;
// 查看是否出错
int errorCode = WSAGETSELECTERROR(lParam);
if(errorCode)
return errorCode; //should put a message up here
int event = WSAGETSELECTEVENT(lParam);
switch(event)
{
case FD_CONNECT:
{
}
break;
case FD_READ:
{
char szText[1024] = { 0 };
::recv(s, szText, 1024, 0);
Recv();
}
break;
case FD_WRITE:
//This event happens when the tcp buffers are ready for another send.
//So if there is not enough room for the first write the event will happen
//and then the buffers are ready for more.
break;
case FD_CLOSE:
break;
}
return 0;
}
@@ -0,0 +1,48 @@
// protocol for control SevenOcean's Machine
//
//////////////////////////////////////////////////////////////////////
#ifndef SO7_TCPIP_H_INCLUDED_
#define SO7_TCPIP_H_INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <afxwin.h>
#include <afxcmn.h>
#include <Winsock2.h>
#define WM_SOCKET WM_USER + 0x1
typedef enum {
TCPIP_CONNECT_OK=0,
TCPIP_INIT_WINSOCK_ERROR,
TCPIP_INVAILD_SOCKET,
TCPIP_INVAILD_IP_ADDRESS,
TCPIP_INVAILD_PORT_NUMBER,
TCPIP_CONNECT_SERVER_FAILED,
} TCPIP_RETURN_CODE;
//======================================================================================
class CSo7_TCPIP
{
public:
CSo7_TCPIP();
virtual ~CSo7_TCPIP();
TCPIP_RETURN_CODE Connect();
TCPIP_RETURN_CODE Send();
TCPIP_RETURN_CODE Recv();
TCPIP_RETURN_CODE DisConnect();
HWND m_hMsgWnd;
LRESULT OnSocket(WPARAM wParam, LPARAM lParam);
private:
SOCKET m_socket;
LPCSTR m_pszNetworkAddr;
u_short m_nPortNumber;
bool m_bDisableTimeout;
int Init_Winsock();
};
#endif