小编Gia*_*ann的帖子

TCP打孔

我正在尝试使用mingw工具链实现使用Windows套接字的TCP打孔.我认为这个过程是正确的,但这个漏洞似乎没有.我用这个作为参考.

  1. AB连接到服务器S.
  2. S发送到A,B的路由器IP +它用来连接S的端口
  3. SB做同样的事情
  4. 一个开始2个主题:
    • 一个线程尝试使用S发送的信息连接到B的路由器
    • 另一个线程正在等待连接到S时用于连接到其路由器的同一端口上的传入连接
  5. B做同样的事情

我认为代码中没有问题,因为:

  • AB确实互相使用ip和port
  • 当他们联系服务器时,他们都在监听他们用来连接路由器的端口
  • 它们都连接到正确的IP和端口但是超时(代码错误10060)

我错过了什么?

编辑:在进程资源管理器的帮助下,我看到其中一个客户端设法建立与对等方的连接.但是同行似乎并没有考虑要建立连接.

这是我用Wireshark捕获的内容.为了示例,服务器S和客户端A在同一PC上.服务器S侦听8060重定向到该PC 的特定端口().B仍然尝试连接正确的IP,因为它看到S发送的A的公共地址是,因此使用S的公共IP .(我已用占位符替换了公共IP)localhost

Wireshark的

编辑2:我认为混淆是由于传入和传出的连接请求数据都在同一端口上传输.这似乎弄乱了连接状态,因为我们不知道哪个套接字将从端口获取数据.如果我引用msdn:

SO_REUSEADDR套接字选项允许套接字被另一个套接字强制绑定到一个端口在使用中.第二个套接字调用setsockopt,其中optname参数设置为SO_REUSEADDR,并且optval参数设置为TRUE在与原始套接字相同的端口上调用bind之前的布尔值.第二个套接字成功绑定后,绑定到该端口的所有套接字的行为都是不确定的.

但TCP Hole …

windows tcp network-protocols winsock2 hole-punching

17
推荐指数
1
解决办法
9842
查看次数

C socket:确实发送等待recv结束?

我在Windows上使用阻塞C套接字.我使用它们将数据的更新从服务器发送到客户端,反之亦然.我以高频率(每100毫秒)发送更新.该send()函数是否会recv()在结束前等待收件人接收数据?

如果我理解man手册页,我会假设:

"send()的成功完成并不能保证传递信息."

那么,如果一个人运行10次,send()而另一个只完成1次,会发生什么recv()

我是否需要使用某种确认系统?

c sockets networking tcp

8
推荐指数
2
解决办法
1万
查看次数

Ruby On Rails很慢......?

我正在编写一个Web应用程序来监控家具厂的生产流程.它有数千个数据需要处理.到目前为止,我在Mongrel + MySQL上运行RoR并且它真的很慢(对于某些视图为2-4分钟).当我查看RoR日志时,似乎数据库查询不是很慢(0-10ms).

RoR在将​​数据库数据转换为对象时是否会变慢?杂种慢吗?

编辑:第一件事:我在开发中.ENV.在生产环境中,最慢的视图需要2分钟(在好的计算机上会减少不到1分钟,我的是5年).使用ruby-prof和一些常识,我发现哪些方法正在减慢应用程序的速度.问题是在大型数据集的循环中调用单个SQL查询:

ofs = Ofkb.find_by_sql ["..some large sql query..."]

for of in ofs # About 700-1000 elements
   ops = Operation.find(..the single query..)
   etc.
end
Run Code Online (Sandbox Code Playgroud)

以下是这些方法的ruby-prof结果:

 %self     total     self     wait    child    calls  name
 32.19     97.91    97.91     0.00     0.00       55  IO#gets (ruby_runtime:0}
 28.31     86.39    86.08     0.00     0.32    32128  Mysql#query (ruby_runtime:0}
  6.14     18.66    18.66     0.00     0.00    12432  IO#write (ruby_runtime:0}
  0.80      2.53     2.42     0.00     0.11    32122  Mysql::Result#each_hash (ruby_runtime:0}
Run Code Online (Sandbox Code Playgroud)

问题是:我无法真正避免那些单一的查询.我有数以千计的事件,我必须从中计算复杂的数据.现在我在那些方法上使用memcached,除非你是第一个请求页面的人.

ruby mysql mongrel ruby-on-rails

7
推荐指数
3
解决办法
8206
查看次数

什么时候使用像Lua这样的嵌入式脚本语言

我玩WoW大约2年了,我对用来写插件的Lua很好奇.因为到目前为止我所读到的Lua是"快速","轻盈"和"这很棒",我想知道如何以及何时使用它.

您需要在系统中嵌入像Lua这样的脚本语言的典型情况是什么?

scripting lua

6
推荐指数
2
解决办法
2873
查看次数

luaL_openlibs的隐式声明

我正在编写一个将Lua嵌入到C程序中的简单测试.

我在Windows/Mingw和Linux上遇到了同样的问题.这是我在Linux上使用的gcc命令:

gcc -Wall -o test_lua lua_test.c -I/usr/include/lua5.1 -llua5.1
Run Code Online (Sandbox Code Playgroud)

在Windows上:

gcc -Wall -o test_lua.exe lua_test.c -llua5.1
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我都有以下警告:

warning: implicit declaration of function 
              'luaL_openlibs' [-Wimplicit-function-declaration]
Run Code Online (Sandbox Code Playgroud)

该程序有效,但也许我不使用任何标准的Lua库?为什么我会收到此警告?我看到了luaL_openLibs定义lauxlib.h!

这是C部分:

#include <lua.h>
#include <lauxlib.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[]) {

  int status;
  lua_State *L;

  L = luaL_newstate();

  // Init lua
  luaL_openlibs(L);

  // Load script
  status = luaL_loadfile(L,"lua_test.lua");
  if (status) {
    fprintf(stderr,"Couldn't load file\n");
    exit(1);
  }

  // Push data
  lua_pushnumber(L, 5000);
  lua_setglobal(L, "clife");
  lua_pushnumber(L, 6000);
  lua_setglobal(L, "ttime"); …
Run Code Online (Sandbox Code Playgroud)

c lua

6
推荐指数
1
解决办法
2759
查看次数

适合Java的2d引擎?

有没有人知道一个很好的2D引擎的Java与精灵,动画和碰撞处理?

java graphics 2d sprite

4
推荐指数
1
解决办法
9032
查看次数

我可以忘记IE6吗?

我是一名在多个网站上工作的顾问,并且有人要求我确保我的工作与IE6兼容.

由于微软建议不再使用它,并且平均有6%的用户使用IE6:我可以建议我的客户忘记IE6吗?

编辑: 该网站是面向消费者的互联网.我不认为IE6对我的客户的强烈要求只是一个老习惯,这就是为什么我问自己,建议反对它是一件好事.

internet-explorer-6

2
推荐指数
2
解决办法
264
查看次数

将数组列表项转换为整数

arr,我有一个arraylist.现在这个arraylist将数字存储为字符串.现在我想将这个arraylist转换为整数类型.那我该怎么办?

ArrayList arr = new ArrayList();

String a="Mode set - In Service", b="Mode set - Out of Service";

if(line.contains(a) || line.contains(b)) {
    StringTokenizer st = new StringTokenizer(line, ":Mode set - Out of Service In Service");
    while(st.hasMoreTokens()) {
      arr.add(st.nextToken());  
    }
}
Run Code Online (Sandbox Code Playgroud)

java

1
推荐指数
1
解决办法
2万
查看次数