execlp 停止使用套接字发送数据

Posted

技术标签:

【中文标题】execlp 停止使用套接字发送数据【英文标题】:execlp stops using socket to send the data 【发布时间】:2012-01-13 17:01:24 【问题描述】:

我正在创建一个程序来远程处理一些数据。 所以我使用类似的东西

猫文件 | ./client -i "machineip" -p "port" -c "command"

如果我想在我的 tar 文件中获取列表,我可以将命令用作“base64 -d | tar -zvt”。 我有那些物品;

Sock.. 是一个实现 C 套接字的对象。 RCVBUFSIZE = 2000 和我用来发送和获取数据的大小 pid 知道我是子进程还是父进程

为此,我正在使用管道和叉子。 基本结构是:

int fd[2];
pipe(fd);
if((pid=fork()) == -1) exit(-1);
if(pid == 0)

 while((recvMsgSize = sock->recv(echoBuffer, RCVBUFSIZE))
  write(fd[1], echoBuffer, recvMsgSize);
 

else pipeback(fd,sock)

所以我可以获取数据并从父母发送给孩子。 客户端从标准输入读取并通过套接字发送,服务器通过套接字读取

问题出在pipeBack

void pipeback(int *fdRef, TCPSocket *sock)
 char *buffer = new char[2000];
 int size;
 close(fdRef[1]);
 dup2(fdRef[0], 0);
 close(fdrEf[0]);
 pipe(fout)
 if((pid = fork()) == -1)exit(-1);
 if(pid ==0)
  close(fout[0]);
  dup2(fout[1], 1);
  close(fout[1]);
  execlp("bash", "bash", "-c", "base64", NULL);
 
 else
  close(fout[1]);
  while((size = read(fout[0], buffer, 2000)) > 0)
   sock->send(buffer, size);
   write(fileno(stdout), buffer, size);
  
 

问题是行“execlp("bash", "bash", "-c", "base64", NULL);"如果我在第四个参数上使用 cat 它会起作用,如果我使用一个 ls -lahtr 会向我显示文件夹中的文件,所以,它就像一个魅力。 但是,当我使用 base64 或 uuencode... 可能其他命令它会在读取行上停止,然后停止,死掉,我使用 strace 和 gdb 来查看发生了什么。 我不知道我需要做什么来调试这个过程。 所以我创建了一个单独的程序,仅从标准输入读取并使用管道在 base64 上处理或使用 bash 进行 uuencode。 它有效,我认为它与套接字或时间有关,但我没有任何想法。 对不起,但我的英语不是那么好... XD。 谢谢你的一切

注意:

我使用了 strace,我注意到当我使用 base64 时,pid 停止,然后它尝试从 pid 读取(已经停止)。

有人知道我该如何解决吗?

【问题讨论】:

【参考方案1】:

问题是

我发送数据并尝试在同一代码块上进行接收。 所以我现在使用 select 等到我有一些数据。

【讨论】:

以上是关于execlp 停止使用套接字发送数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用之前清除内部服务器套接字缓冲区的内容

数据报通道套接字不写 Java

可以在数据报套接字中使用发送和接收吗?

IOS4 - 在 Wifi 上使用 UDP 套接字发送数据

发送后如何正确关闭套接字(使用 IOCP)?

使用异步套接字编程发送二进制数据并读取其值