⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsmpctcp.cpp

📁 Simple Module Procedure Call for windows & QNx
💻 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 + -