TcpSocketServer는 C#으로 작성되었으며 CLI없이 기본 C++에서 사용하려고합니다. 클래스는 클라이언트 연결/연결 해제 및 데이터 수신시 이벤트를 발생시킵니다. 지금까지 서버를 작동시키고 연결을 허용했지만 데이터를 보내거나받을 수는 없습니다.COM + Interop을 사용하여 C++ 비 관리 코드에서 C# 이벤트 처리
이 클래스는 내가 필요로하는 몇 가지 클래스 중 하나이기 때문에 원시 C++ 소켓을 사용하도록 제안하지 마십시오.
(관련) C# 코드가 우는 소리입니다 : 이제
[ComVisible(true)]
public delegate void TcpClientConnectedEventHandler(Socket s);
[ComVisible(true)]
public delegate void TcpClientDisconnectedEventHandler(EndPoint ep);
[ComVisible(true)]
public delegate void TcpDataReceivedEventHandler(TcpPacket p);
[ComVisible(true)]
[Guid("7cf49dcd-c11b-4e94-9f73-d5a24fe027c3")]
public interface ISocketTcpServer
{
event TcpClientConnectedEventHandler ClientConnected;
event TcpClientDisconnectedEventHandler ClientDisconnected;
event TcpDataReceivedEventHandler DataReceived;
[ComVisible(true)]
int SendToAll(byte[] buffer);
}
, C에서 + + I 다음 (관련) 코드가 있습니다
// Function Prototypes
void onClientConnected();
void onClientDisconnected();
void onDataReceived(ITcpPacket *packet);
VARIANT_BOOL started(ISocketTcpServer *server);
long send(ISocketTcpServer *server, char *s);
int main(int argc, char* argv[])
{
ISocketTcpServer *server = NULL;
_TcpDataReceivedEventHandler *dataReceivedPtr = NULL;
_TcpClientConnectedEventHandler *clientConnectedPtr = NULL;
_TcpClientDisconnectedEventHandler *clientDisconnectedPtr = NULL;
char sInput[1024];
std::cout << "C# Sockets Interop example.\r\n";
// Initialize COM.
CoInitialize(NULL);
// Create the interface pointers.
HRESULT hr = CoCreateInstance(__uuidof(SocketTcpServer), NULL,
CLSCTX_INPROC_SERVER, __uuidof(ISocketTcpServer), (void **)&server);
if((hr != S_OK) || (server == NULL))
{
std::cout << "Create instance failed\r\n";
CoUninitialize();
return 0;
}
// Configure TCP Server
server->put_Port(2000);
dataReceivedPtr = (_TcpDataReceivedEventHandler *)&onDataReceived;
clientConnectedPtr = (_TcpClientConnectedEventHandler *)&onClientConnected;
clientDisconnectedPtr =
(_TcpClientDisconnectedEventHandler *)&onClientDisconnected;
/* HERE IS WHERE I SET UP THE EVENTS */
server->add_ClientConnected(clientConnectedPtr);
server->add_ClientDisconnected(clientDisconnectedPtr);
server->add_DataReceived(dataReceivedPtr);
// Start TCP Server
std::cout << "Starting TCP Server on port 2000.\r\n";
server->Start();
while(!started(server)) Sleep(100);
while(started(server))
{
std::cin >> sInput;
send(server, sInput);
}
// Uninitialize COM.
CoUninitialize();
return 0;
}
long send(ISocketTcpServer *server, char *s)
{
long result = 0;
server->SendToAll((SAFEARRAY *) s, &result);
return result;
}
모든 다른 기능 정의를 가지고 잘 작동을, 그래서 나는 그들을 포함하지 않았다.
중요한 질문은 다음과 같습니다. 이벤트를 처리하기 위해 이벤트를 처리 할 함수를 어떻게 선언해야합니까? 나는 그들이 관련된 Delegate와 일치하지 않기 때문에 작동하지 않는다. 그러나 .NET Framework의 Socket과 EndPoint 클래스에는 액세스 할 수 없다.
또한있어서
SendToAll(byte[] buffer):int
함수
SendToAll(SAFEARRAY *buffer, long *pRetVal):HRESULT
매핑하지만이 주조 문제가 될 수있다.
나에게 줄 수있는 도움이나 조언이 유용 할 것입니다.
미리 뱅크스.