问题遇到的现象和发生背景
我使用socket开发一个端口穿透工具,我想将本地的tcp端口转发到公网的服务器上,然后可以开放给其他人访问。
要点: 自己开发,不使用其他成熟工具,小弟只想要知道结果
遇到的现象和发生背景,请写出第一个错误信息
我服务端已经将数据发送到agent端的socket之后,使用select判断readfds中的状态,发现不能读取,我使用控制台printf直接读取内容发现存在内容可以读取,但是select不能获取到读取状态
数据交换函数代码
int example(int server_fd,int internal_fd){
fd_set readfd,writefd;
char from_server_buffer[MAXBUFFERLEN]={0};
char from_internal_buffer[MAXBUFFERLEN]={0};
int from_server_readlen=0;
int from_internal_readlen=0;
FD_ZERO(&readfd);
FD_ZERO(&writefd);
FD_SET(server_fd,&readfd);
FD_SET(internal_fd,&readfd);
FD_SET(internal_fd,&writefd);
FD_SET(server_fd,&writefd);
int selectret=0;
int maxfd=(server_fd>internal_fd)?server_fd:internal_fd;
struct timeval timeset;
timeset.tv_sec=10000;
timeset.tv_usec=0;
prinft("server_fd: %d internal_fd: %d maxfd: %d\n",server_fd,internal_fd,maxfd);
while(1){
int error=0;
selectret=select(maxfd+1,&readfd,&writefd,NULL,×et);
if(selectret == -1 && errno == EINTR){
prinft("select接受错误!!");
continue;
}else if (selectret ==0){
prinft("超时了哦!!");
continue;
}
if(FD_ISSET(server_fd,&readfd)){
int readlen=0;
char buffer[4096]={0};
int error=0;
while(error!=1){
readlen=read(server_fd,buffer,MAXBUFFERLEN);
if(readlen >0){
prinft("从server端读取到内容: %s len: %d\n",buffer,readlen);
}else{
error=1;
}
if(readlen>0){
int ret=write(internal_fd,buffer,readlen);
prinft("开始写入 buffer: %s len: %d ret: %d\n",buffer,readlen,ret);
memset(buffer,0,4096);
}else{
error=1;
}
}
}else{
prinft("读取server_Fd未就绪\t");
int readlen=0;
char buffer[4096]={0};
readlen=read(server_fd,buffer,MAXBUFFERLEN);
prinft("尝试读取的结果: %s\n",buffer);
}
if(FD_ISSET(internal_fd,&readfd)){
char buffer[4096]={0};
int readlen=read(internal_fd,buffer,MAXBUFFERLEN);
prinft("从agent端读取到内容: %s len: %d\n",buffer,readlen);
memcpy(from_internal_buffer,buffer,readlen);
from_internal_readlen+=readlen;
}
if(from_internal_readlen>0){
int ret=write(server_fd,from_internal_buffer,from_internal_readlen);
prinft("开始写入 buffer: %s len: %d\n",from_internal_buffer,from_internal_readlen);
from_internal_readlen-=ret;
memset(from_internal_buffer,0,4096);
}
sleep(1); //防止重复刷log,影响debug
}
return 1;
}
wireshark有流量返回
运行结果及详细报错内容
控制台打印log发现存在可读的内容
我想要达到的结果
我想要知道FD_ISSET为什么不能判断状态为可读,因为我其他的地方也有这个问题。。包括服务端
源码文件
访问即可下载: https://120.27.210.140:19980/
直接
gcc agent.c -o agent
gcc server.c -p serv
就好了
显示内容