REMOVE DLLCHR.Add TCP/IP COMM.
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user