📄 dsmpctcp.cpp
字号:
#include <stdio.h>
#ifdef WIN32
#include <winsock.h>
#else
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/tcp.h>
typedef int SOCKET;
typedef hostent* PHOSTENT;
typedef sockaddr* PSOCKADDR;
typedef sockaddr_in SOCKADDR_IN;
#define closesocket close
#define SOCKET_ERROR -1
#endif
#include <smpc/dsmpcsrv.h>
#include "dsmpcmsg.h"
class DTcpServer : public DSmpcServer
{
private:
char* name;
SOCKET sock;
dword type;
dword nsid;
DSmpcMsg msg;
int Connect(void);
int Disconnect(void)
{
if(sock) { closesocket(sock); sock = 0; return 1; }
return 0;
}
dword Send(void* buffer, dword size)
{
for(dword i = 0, ii; i < size; i += ii)
if((ii = send(sock,(char*)buffer + i,size - i,0)) == SOCKET_ERROR) break;
return i;
}
dword Recv(void* buffer, dword size)
{
for(dword i = 0, ii; i < size; i += ii)
if((ii = recv(sock,(char*)buffer + i,size - i,0)) == 0 || ii == SOCKET_ERROR) break;
return i;
}
public:
DTcpServer(dword sid, dword _type, char* _name, dword _nsid) : DSmpcServer(sid)
{
name = new char[strlen(_name) + 1];
if(name) strcpy(name,_name);
type = _type; nsid = _nsid; sock = 0;
}
~DTcpServer() { Disconnect(); if(name) delete name; }
char* Name(void) const { return name; }
int Connected(void) const { return sock != 0; }
virtual int Call(dword, void*, dword, void*, dword&);
virtual dword Type(void) const { return type; }
};
int DTcpServer :: Connect(void)
{
Disconnect();
if(!name) return 0;
PHOSTENT he = gethostbyname(name);
if(!he) return 0;
SOCKADDR_IN sin;
memcpy(&(sin.sin_addr),he->h_addr,he->h_length);
sin.sin_port = htons(3001); sin.sin_family = AF_INET;
sock = socket(AF_INET,SOCK_STREAM,0);
if(!sock) return 0;
int val = 1;
setsockopt(sock,getprotobyname("TCP")->p_proto,TCP_NODELAY,(const char*)&val,sizeof(val));
if(connect(sock,(PSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR) Disconnect();
return sock != 0;
}
int DTcpServer :: Call(dword proc, void* sd, dword snd, void* rd, dword& rcv)
{
if(!sock && !Connect()) return Smpc_Err_Server;
msg.msg = Smpc_Msg_Call; msg.sid = nsid; msg.proc = proc; msg.send = snd; msg.recv = rcv;
if(Send(&msg,sizeof(msg)) != sizeof(msg)) { Disconnect(); return Smpc_Err_Server; }
if(Send(sd,snd) != snd) { Disconnect(); return Smpc_Err_OutSize; }
if(Recv(&msg,sizeof(msg)) != sizeof(msg)) { Disconnect(); return Smpc_Err_Server; }
if(msg.msg != Smpc_Msg_Return) { Disconnect(); return Smpc_Err_Server; }
if(msg.error != Smpc_Success) {
if(msg.error == Smpc_Err_Server) Disconnect();
return msg.error;
}
if(msg.recv > rcv) { Disconnect(); return Smpc_Err_OutSize; }
rcv = msg.recv;
if(Recv(rd,rcv) != rcv) { Disconnect(); return Smpc_Err_Server; }
return Smpc_Success;
}
void main(int argc, char* argv[])
{
puts("SMPC to TCP/IP translator v1.00 Dynamics Co.Ltd Copyright(C) - 1999");
if(argc < 4) { puts("Use: dsmpctcp <sid> <type> <host> [<remote sid>]"); return; }
#ifdef WIN32
WSADATA wsaData;
if(WSAStartup(MAKEWORD(1,1),&wsaData)) return;
#endif
DSmpc* smpc = CreateSmpc();
if(smpc) {
DTcpServer* srv = new DTcpServer(atoi(argv[1]),atoi(argv[2]),argv[3],atoi(argv[argc < 5 ? 1 : 4]));
if(smpc->add(srv)) smpc->Run();
else if(srv) delete srv;
delete smpc;
}
#ifdef WIN32
WSACleanup();
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -