套接字发送问题

时间:2009-08-22 00:39:10

标签: c++ sockets

有什么理由不起作用吗?

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

我的意思是,通过从0到10000的每个数字发送“abc”,我们不是在理论上通过很多不同的套接字传递?大多数0到10000之间的数字都不对应任何套接字,但有些会对应。这是对的吗?

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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()。但是,您必须创建一个套接字以在您自己的进程中获取文件描述符,并知道您希望在何处侦听或连接。

答案 2 :(得分:0)

所以,根据你对其他人的回复......

您的计算机上运行的程序A已打开与其他程序B的套接字连接,该程序可以在任何地方运行。但是这些程序都不是你在这里写的那个。因此,您希望程序能够通过程序A的套接字连接将数据发送到程序B.

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

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

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

在不知道你真正想要实现的目标的情况下,我不能说你的目标是否会变得复杂和耗时,或者你只是一个坏主意,你不应该尝试去做。但无论如何,我建议尝试找到一种不同的方法,而不是试图通过另一个程序的套接字发送数据。