2009-08-22 146 views
0

这是不是有什么理由不起作用?套接字发送问题

[PseudoCode] 
    main() { 
     for (int i = 0; i < 10000; ++i) { 
      send(i, "abc", 3, 0); 
     } 
    } 

我的意思是,通过每一个号码发送“ABC”从0到10000,都没有经过我们在理论上受到了很多不同的插座?大多数0到10000之间的数字不对应任何套接字,但有些会。它是否正确?

编辑:期望的目标是通过每个具有开放套接字的应用程序发送“abc”。

回答

2

这将永远不会工作。文件描述符仅在同一进程(及其子进程)内有用。

您必须创建一个套接字(这将为您提供一个您拥有并可以使用的文件描述符),将其连接到一个终点(当然必须打开并收听),然后才能通过它。

对于example

struct sockaddr_in pin; 
struct hostent *hp; 

/* go find out about the desired host machine */ 
if ((hp = gethostbyname("foobar.com")) == 0) { 
    exit(1); 
} 

/* fill in the socket structure with host information */ 
memset(&pin, 0, sizeof(pin)); 
pin.sin_family = AF_INET; 
pin.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr; 
pin.sin_port = htons(PORT); 

/* grab an Internet domain socket: sd is the file descriptor */ 
if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
    exit(1); 
} 

/* connect to PORT on HOST */ 
if (connect(sd,(struct sockaddr *) &pin, sizeof(pin)) == -1) { 
    exit(1); 
} 

/* send a message to the server PORT on machine HOST */ 
if (send(sd, argv[1], strlen(argv[1]), 0) == -1) { 
    exit(1); 
} 

硬币的另一面是创建一个监听套接字(什么服务器做),这将接收连接。这个过程是类似的,但是这些调用改变了,它们是socket(),bind(),listen(),accept()。不过,您必须创建一个套接字才能在自己的进程中获取文件描述符,并知道您想要听或连接到哪个位置。

+0

有没有办法让给定进程的给定套接字ID(第一个参数send())通过我的应用程序发送,而不必进行dll注入? – 2009-08-22 01:31:14

+0

所以继续这个例子。如果您想将“ABC”发送到您机器上的每个侦听端口,请将该代码粘贴到您的循环中。只增加PORT而不是尝试使用未初始化的套接字调用发送。还要将“foobar.com”改为“localhost”,或者你想连接的任何机器的名称。还要将出口改为简单的继续。这将通过端口0循环到10000,尝试连接到它,并在成功的连接发送“ABC”(假设您将“argv [1]”替换为“ABC”)。另外不要忘记关闭连接:close(sd); – 2009-08-22 01:32:59

+0

我不想将它发送到每个侦听端口。我想将它发送到已经创建的应用程序X连接。 – 2009-08-22 01:38:11

2

这不起作用。在您的进程中的文件描述符0不会让您在某些其他应用程序的进程中访问文件描述符0。

要回答您的后续问题:套接字ID是每个进程本地的。它们的行为与文件描述符很相似 - 一次运行的进程很多,当然操作系统会跟踪哪个进程有哪些文件打开。但在每个进程中,文件描述符 0,1和2将分别引用其自己的私有stdin stdout和stderr流。 创建套接字时,它所分配的文件描述符也只能从该进程中访问。

+0

你能解释一下它的确如何工作?我知道在一个进程中写入内存的内容不能被其他进程访问(至少没有Write/ReadProcessMemory)。但是,例如,如果我挂钩使用套接字的应用程序来获取正确的套接字ID,如果我尝试从我的套接字ID,它不应该工作吗?我的意思是,过程的本地套接字ID(驻留在内存中)还是全局的,驻留在共享的Windows内存中? – 2009-08-22 01:45:53

0

因此,根据您的回复给其他人...

你有计划你的机器已经打开的套接字连接一些其它程序B,它可在任何地方运行在正在运行的。但是这些程序都不是你想要在这里写的。所以你希望你的程序能够通过程序A的套接字连接发送数据到程序B.

如果这大致是你想要做的,那么不,你可能不能这样做。至少不是没有dll注入才能进入程序A的过程。

此外,即使您可以找到通过程序A的套接字发送的方法,您也必须知道程序A的通信协议的确切详细信息和B正在使用。如果你不这样做,那么你就会冒数据发送给程序B的风险,它并不期望,在这种情况下,它可能会终止连接,崩溃或做任何数量的坏事,这取决于它是如何写入的。

如果你真的试图发送一个特定的数据,不仅仅是通过一个单独的程序A,而是通过打开套接字连接的计算机上的每个程序发送一个特定的数据,那么你很可能会遇到我刚刚描述的内容。即使您要发送的数据适用于某个特定程序,其他程序几乎肯定会使用完全不同的通信协议,因此在处理数据时很可能会遇到问题。

不知道你真的想达到什么目的,我不能说你的目标是否会变得复杂和耗时,或者如果它不是一个好主意,试图去做。但无论如何,我会建议试图找到一种与尝试通过另一个程序的套接字发送数据不同的更好的方法。