我正在创建一个套接字程序来将数据从一台 pc 传输到另一台,但是当我将一些二进制数据发送到另一端进行处理时出现问题。在这种情况下,我需要一个线程在数据套接字发送数据时监听消息套接字。所以我发现问题不在于套接字,如果我尝试将数据写入屏幕(这次没有套接字),就会出现问题。所以我尝试使用 fflush(stdout) 刷新数据但没有运气。代码以这种方式工作。
Initialize the 2 sockets.
Initialize 2 threads.
One to get the data back through the data socket.
The other send the data.
And while sending all the data one while(true){sleep(1)} in the main function, because the data can take 1 second to be processed or one hour so i keep the program alive this way (Don't know if that is the better way).
我创建了一个较小的版本,只使用一个线程来读取并发送到屏幕,并在主线程中。
代码:
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
const int RCVBUFSIZE=2000;
char echoString[RCVBUFSIZE];
static void * _sendExec(void *instance);
int main(){
pthread_t m_thread;
int merror;
merror=pthread_create(&m_thread, NULL, _sendExec, NULL);
while(1){sleep(1);}
}
static void * _sendExec(void *instance){
int size;
for(;;){
while((size=read(fileno(stdin), echoString, RCVBUFSIZE))>0) write(fileno(stdout), echoString, size);
fflush(stdin);
fflush(stdout);
pthread_exit(0);
}
}
如果你尝试 cat file.tar.gz | ./a.out | tar -zvt 你可以看到不是所有的数据都显示在屏幕上,如果我放在主屏幕上,取消睡眠就可以了,问题是我需要恢复数据,这可能需要一些时间。就像我做一个 cat file.tar.gz | ssh root@server "tar -zvt"。
感谢人们