linux socket 中 accept() 问题
最近在看nc的代码 又学了点linux c语言 于是就写个小的shell重定向练练手
代码如下
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>
#include <strings.h>
//netcat [shell] [port]
int main(int argv , char** args)
{
struct sockaddr_in asddr , m_rec;
int in[2],out[2];
int pid , len;
int m_socket , m_return ,EchoCnt,BufferCnt;
char RecvBuffer[1];
char Buffer[1024];
char EchoBuffer[5];
char readbuf[1024];
int readlen , bytesSend;
if(argv < 3)
{
printf( "netcat [shell] [port]\n ");
exit(0);
}
pipe(in);
pipe(out);
len = sizeof(struct sockaddr_in);
m_socket = socket(PF_INET ,SOCK_STREAM , 0);
if(-1 == m_socket)
{
perror( "socket error: ");
exit(0);
}
asddr.sin_family = AF_INET;
asddr.sin_addr.s_addr = INADDR_ANY;
asddr.sin_port = htons(atoi(args[2]));
if(bind(m_socket , (struct sockaddr *)&asddr , sizeof(struct sockaddr))!=0)
{
perror( "bind error: ");
exit(0);
}
if(listen(m_socket , 5)!=0)
{
perror( "listen error: ");
exit(0);
}
loop:
if((pid=fork())==-1)
{
perror( "fork error: ");
exit(0);
}
if(pid==0)
{
close(in[1]);
close(out[0]);
dup2(in[0],0);
dup2(out[1],1);
dup2(out[1],2);
execlp(args[1],args[1],NULL);
//perror( "execlp: ");
//exit(0);
}
else
{
while(1)
{
if((m_return = accept(m_socket , &m_rec , &len))==-1)
{
perror( "accept error: ");
exit(0);
}
BufferCnt=0;
while (recv(m_return, RecvBuffer, sizeof(RecvBuffer), 0) != 0)
{
EchoCnt = 0;
Buffer[BufferCnt++] = EchoBuffer[EchoCnt++] = RecvBuffer[0];
if (RecvBuffer[0] == '\r ')
Buffer[BufferCnt++] = EchoBuffer[EchoCnt++] = '\n ';
if (RecvBuffer[0] == '\n ' || RecvBuffer[0] == '\r ')
{
if (write(in[1],Buffer, BufferCnt)==BufferCnt)
{
BufferCnt = 0;
break;
}
else
{
perror( "writing to pipe : ");
exit(0);
}
BufferCnt = 0;
}
}
readlen = read(out[0] ,readbuf, 1024);
if(readlen==-1)
{
perror( "read error: ");
exit(0);
}
if(readlen != send( m_return, readbuf, readlen, 0 ))
{
}
}
}
return 0;
}
编译通过生成shell 运行 shell /bin/sh 8000
在windows下用 nc ip 8000 连接 发现可以运行命令 也有回显重定向都没问题 但是就是只能执行一条命令,在输入命令就没回显了 不知道为什么?
用gdb调试了下
原因是第一次accept能返回,
第二次就阻塞了,不知道为什么
大伙有知道的吗.教教我啦
有没有大侠可以告诉小弟的
呵呵
谢谢
[解决办法]
不是accept本身的问题,accept在接收到nc的连接后,就可以开始收发数据了,如果你想再次accept,你需要启动另一个nc