【发布时间】:2019-01-07 14:53:58
【问题描述】:
我创建了一个类作为另一个应用程序的插件。它应该包含要在主应用程序中使用的功能。它通常工作 - 这意味着我可以处理常用功能,如计算甚至读取文件。但是我在实现套接字类时遇到了问题。我一般都知道如何使用套接字,但在这种情况下我遇到了问题。
正如您在代码中看到的,有一个内部类SockAttrib 应该管理套接字的创建、监听以及消息。收到的消息存储在字典中。
public class Net : Module {
private static ReadOnlyCollection<CustomMethod> customMethods;
internal class SockAttrib {
public Socket listener;
public Socket handler;
/* create the listener */
public SockAttrib(int port) {
IPHostEntry host = Dns.GetHostEntry("localhost");
IPAddress ipAddress = host.AddressList[1];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port);
try {
listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(localEndPoint);
listener.Listen(10);
handler = listener.Accept();
} catch (Exception e) { Console.WriteLine("socket() " + e); }
}
/* listen */
public SockAttrib() {
try {
// Incoming data from the client.
string data = "";
byte[] bytes = null;
while (true) {
bytes = new byte[1024];
int bytesRec = handler.Receive(bytes);
data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
if (data.IndexOf("<EOF>") > -1)
{
messages[++idm] = data;
//return;
}
}
}
catch (Exception e) { Console.WriteLine("listen() "+e); }
}
public void Close() {
handler.Close();
}
}
/* message index */
private static int idm = 0;
/* list of messages */
private static Dictionary<int, String> messages = new Dictionary<int, String>();
public Net() {
if (customMethods != null) return;
List<CustomMethod> moduleMethods = new List<CustomMethod>();
moduleMethods.Add(new CustomMethod(typeof(int), "socket", typeof(int)));
moduleMethods.Add(new CustomMethod(typeof(int), "listen" ));
moduleMethods.Add(new CustomMethod(typeof(string), "sockread"));
customMethods = moduleMethods.AsReadOnly();
}
public ReadOnlyCollection<CustomMethod> Prototypes {
get { return customMethods; }
}
public object OnMethodInvoke(String functionName, List<object> parameters) {
if( functionName == "socket") {
int port = (int)parameters[0];
SockAttrib sa = new SockAttrib( port );
return 1;
}
if (functionName == "listen") {
SockAttrib sa = new SockAttrib();
return 1;
}
if (functionName == "sockread") {
if (idm > 0) {
String message = messages[--idm];
return message;
} else {
return "nope";
}
}
return false;
}
}
我的问题是处理程序。套接字的创建工作,但是一旦我使用 netcat 连接到套接字,套接字就会停止侦听并且我没有得到任何响应。我希望它没有太多的代码,它也应该易于阅读。
最后,模块被导出为库 (dll),所以我不能在不发布模块处理程序的情况下给出一个最小的工作示例。
【问题讨论】:
-
这很清楚。在
OnMethodInvoke中,您总是创建一个新的SockAttribute对象并在构造函数完成后再次丢弃它。每个SockAttribute对象都有自己的“处理程序”和“侦听器”字段。 -
你能告诉我具体在哪里吗?因为我创建了两种方法,一种包括端口作为参数,另一种不带任何参数,不带参数的不应该创建新的套接字,只需监听现有的一个,所有传入的消息都应该存储在字典中以使用 @ 读取它987654326@。这是我的意图。
-
哦(我想)我明白你的意思。您的意思是我应该在
OnMethodInvoke::socket()中创建套接字并将套接字 存储在字典中吗?如果是这样,那么我不知道如何正确地从套接字读取,因为在OnMethodInvoke中定义的所有“函数”都是从主机应用程序调用的,并且消息将比主机应用程序调用readsock()更快地到达(可能 - 也许不是)。这就是我尝试将所有消息存储在字典中的原因。 -
看来你有某种由 OnMethodInvoke 实现的 API。你能分享一下这个 API 的描述吗?
-
你的意思是解释还是源代码?当然我可以分享(包括 desc 和源代码),但它是一个相当大的项目,所以我不知道我是否应该把它贴在这里。我考虑过发布 Github 链接,但我认为这是不允许的。