这将永远不会工作。文件描述符仅在同一进程(及其子进程)内有用。
您必须创建一个套接字(这将为您提供一个您拥有并可以使用的文件描述符),将其连接到一个终点(当然必须打开并收听),然后才能通过它。
对于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()。不过,您必须创建一个套接字才能在自己的进程中获取文件描述符,并知道您想要听或连接到哪个位置。
有没有办法让给定进程的给定套接字ID(第一个参数send())通过我的应用程序发送,而不必进行dll注入? – 2009-08-22 01:31:14
所以继续这个例子。如果您想将“ABC”发送到您机器上的每个侦听端口,请将该代码粘贴到您的循环中。只增加PORT而不是尝试使用未初始化的套接字调用发送。还要将“foobar.com”改为“localhost”,或者你想连接的任何机器的名称。还要将出口改为简单的继续。这将通过端口0循环到10000,尝试连接到它,并在成功的连接发送“ABC”(假设您将“argv [1]”替换为“ABC”)。另外不要忘记关闭连接:close(sd); – 2009-08-22 01:32:59
我不想将它发送到每个侦听端口。我想将它发送到已经创建的应用程序X连接。 – 2009-08-22 01:38:11