4 votes

Comment puis-je intégrer un socket dans Lua en interne, tout comme oslib, debuglib ?

Je veux implémenter la fonction comme si j'intégrais la fonction socket dans ma construction Lua. Ainsi, je n'ai plus besoin de copier socket.core.dll (juste pour le plaisir).

J'ai fait une recherche sur la liste, et j'ai vu que quelques personnes discutaient du sujet, http://lua-users.org/lists/lua-l/2005-10/msg00269.html

Mais j'ai une question pour les étapes détaillées, qui pourrait me donner les étapes détaillées pour changer le code lua et luasocket pour les faire fonctionner ensemble (pas avec la méthode dll).

J'ai essayé ces étapes sous Windows xp avec VC2008 :

1) copier le code luasocket dans le projet Lua.

2) ajouter du code

static const luaL_Reg lualibs[] = {
  {"", luaopen_base},
  {LUA_LOADLIBNAME, luaopen_package},
  {LUA_TABLIBNAME, luaopen_table},
  {LUA_IOLIBNAME, luaopen_io},
  {LUA_OSLIBNAME, luaopen_os},
  {LUA_STRLIBNAME, luaopen_string},
  {LUA_MATHLIBNAME, luaopen_math},
  {LUA_DBLIBNAME, luaopen_debug},
  {LUA_SOCKETLIBNAME, luaopen_socket_core}, // add this line
  {LUA_MIMELIBNAME, luaopen_socket_core}, // add this line
  {NULL, NULL}
};

3) construire le projet et l'exécuter.

Lorsque je tape print(socket._VERSION) , il montre luasocket 2.0.2 il est correct.

Lorsque je tape print(socket.dns.toip("localhost")) , il montre 127.0.0.1 table: 00480AD0 , c'est également correct.

Mais lorsque j'essaie d'utiliser d'autres fonctions, par exemple la liaison, cela ne fonctionne pas.

Qui pourrait m'en donner la raison ?

6voto

douyw Points 971

Il faut mettre les trucs luasocket dans la table package.preload, de cette façon :

lua_getfield(L, LUA_GLOBALSINDEX, "package");
lua_getfield(L, -1, "preload");
lua_pushcfunction(L, luaopen_socket_core);
lua_setfield(L, -2, "socket.core");

// add mime.core yourself...

1voto

Etan Reisner Points 10614

Luasocket est un module mixte C/lua, vous devez intégrer les deux versions dans votre application si vous voulez qu'elle fonctionne sans fichiers supplémentaires.

socket.lua charge socket.core (à partir de socket/core.dll)
mime.lua charge mime.core (à partir de mime/core.dll)

Pour que votre application fonctionne, vous devrez donc intégrer tous les fichiers .dll et .lua dans votre application et les charger manuellement (ou les configurer pour qu'ils soient chargés correctement via des chargeurs de paquets personnalisés).

Le courriel que vous avez cité modifie la table package.preload (d'une manière qui semble un peu étrange aujourd'hui mais qui pourrait fonctionner de toute façon) pour que le code C intégré soit chargé correctement lorsque require est appelé.

0voto

Norman Ramsey Points 115730

Essayez de courir

for k, v in pairs(socket) do print(k, v) end

et nous pourrons peut-être vous aider.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X