首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux socket 中 accept() 有关问题

2012-02-20 
linux socket 中 accept() 问题最近在看nc的代码又学了点linuxc语言于是就写个小的shell重定向练练手代码

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

热点排行