- 论坛徽章:
- 0
|
怎样重定向程序的输入和输出到一个本地端口
我用了一个>1024的端口传pop3,只要能收信就可以了. 程序是拼凑出来的,让大家见笑了,重点在do_serve函数上.
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <stdio.h>
- #include <unistd.h>
- int do_serve(int sock_listen, char *cmd_line)
- {
- int sock_serve, addr_len;
- struct sockaddr_in client_addr;
- addr_len = sizeof(client_addr);
- sock_serve = accept(sock_listen, (struct sockaddr *) &client_addr, &addr_len);
- if (sock_serve<0) {
- perror("cannot accept connection ");
- return sock_serve;
- }
- printf("\nclient connected\n");
- if (!fork()) {
- /* child */
- int status;
- printf("%d forked, going to exec %s\n", getpid(), cmd_line);
- dup2(sock_serve, STDIN_FILENO);
- dup2(sock_serve, STDOUT_FILENO);
- status = system(cmd_line);
- close(sock_serve);
- exit(status);
- }
- else {
- int status, pid;
- pid = wait(&status);
- printf("%d finished\n", pid);
- }
- close(sock_serve);
- return 0;
- }
- int main (int argc, char *argv[])
- {
- int sock_listen;
- struct sockaddr_in serv_addr;
- int status = 0;
- int port;
- char *cmd_line;
- if (argc < 3) {
- fprintf(stderr, "Usage: %s port cmd_line\n", argv[0]);
- return 1;
- }
- port = atoi(argv[1]);
- cmd_line = argv[2];
- sock_listen = socket(AF_INET, SOCK_STREAM, 0);
- if (sock_listen<0) {
- perror("cannot open socket ");
- return 1;
- }
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
- serv_addr.sin_port = htons(port);
- if (bind(sock_listen, (struct sockaddr *) &serv_addr, sizeof(serv_addr))<0) {
- perror("cannot bind port ");
- return 1;
- }
- listen(sock_listen,5);
- printf("server is up at port %d\n", port);
- status = 0;
- while (!status) {
- status = do_serve(sock_listen, cmd_line);
- }
- close(sock_listen);
- return status;
- }
复制代码 |
|