⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpser.c

📁 FTP服务器示例 实现客户发出请求下载服务端文件的功能 服务器能同时响应多个客户的请求 编译方式: cc TcpSer.c -o TcpSer -lsocket
💻 C
字号:
/**********************************************  PROGRAM: TcpSer.c                      ****  AUTHOR:  Megan                         ****  WRITE DATE:          02/03/2001        ****  LAST MODITY DATE:    04/04/2001        ****  COMMENT: FTP服务器  V1.00              ****    实现客户发出请求下载服务端文件的功能 ****    服务器能同时响应多个客户的请求       ****编译方式: cc TcpSer.c -o TcpSer -lsocket **********************************************/#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <signal.h>#include <stdio.h>#include <unistd.h>#include <string.h>#define   S_OWN_PORT    5000#define   BUF_LEN       32765#define   FALSE         0#define   TRUE          1/*    定义全局变量      */int   _nQuit;                      //退出标志/*    函数说明     */int  Putdata(int socketsd);        //处理文件传送过程int  Quitset(int sig);             //设置退出标志/*    服务器端主程序     */int main(void){    struct sockaddr_in ser_addr;//    struct sockaddr cli_addr;    int   nServersd,nNewsocket;    pid_t pid;     _nQuit = FALSE;    signal(SIGQUIT,Quitset);      //等待中断信号    //第一步创建套接字    if ( ( nServersd = socket(AF_INET,SOCK_STREAM,0) ) < 0 )    {       fprintf(stderr,"\nCreate socket failed\n");       return (-1);    }    //第二步初使化服务器端地址    ser_addr.sin_family = AF_INET;    ser_addr.sin_port = htons(S_OWN_PORT);    ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);     //第三步绑定套接字    if (bind(nServersd,(struct sockaddr*)&ser_addr,sizeof(ser_addr)) < 0)    {       fprintf(stderr,"\nbind failed.\n");       close(nServersd);       return -1;    }       //第四步监听客户请求    listen(nServersd,5);    system("clear");    fprintf(stderr, "\n等待客户请求....\n");    while(_nQuit==FALSE)    {       //第五步接受客户请求       if ((nNewsocket = accept(nServersd,0,0)) < 0)       {          fprintf(stderr,"Accept failed \n");          close(nServersd);          return -1;       }       //第六步创建子进程处理客户请求       if ((pid=fork()) ==0)        {          close(nServersd);                        if (Putdata(nNewsocket) <0)    //传送文件          {             fprintf(stderr,"\n处理过程出错\n");             close(nNewsocket);             return -1;          }          return (0);       }             if (pid > 0)       {           close(nNewsocket);       }       else          {             fprintf(stderr,"\n创建进程出错....,继续接收别的客户请求\n");             close(nNewsocket);             //此处是否应该关闭服务器端套接字  close(nServersd);          }    }    close(nServersd);    return 0;}  /* * Putdata()     -- 处理文件传送 * int socketsd  -- 客户端 SOCKET 套接字 * return        -- -1: 失败 -2: 打开文件失败 0: 成功 */ int Putdata(int socketsd){   FILE*   fp;   char    sSerbuf[BUF_LEN];      //传送数据缓冲区   int     nLen;   memset(sSerbuf,0,BUF_LEN);   //第一步取文件名   nLen = read(socketsd,sSerbuf,sizeof(sSerbuf));   if (nLen == -1)   {      fprintf(stderr,"\nGet Filename Message failed\n");      return (-1);   }   printf("Get Filename:%s success\n",sSerbuf);   if ( !stat(sSerbuf) )         //测试文件是否存在      return (-1);   //第二步打开文件   if ((fp = fopen(sSerbuf,"rb")) == NULL)     {      fprintf(stderr,"open File %s fail\n",sSerbuf);      return (-2);   }   printf("开始传送文件 %s .....\n",sSerbuf);   memset(sSerbuf,0,BUF_LEN);   //读取源文件并发送   //while (!feof(fp))   while ( 1 )   {      //nLen = fread(sSerbuf,sizeof(sSerbuf),1,fp);       nLen = fread(sSerbuf, 1, BUF_LEN, fp);       if (ferror(fp))      {         printf("\n fread file error\n");         fclose(fp);         close(socketsd);         return -1;      }      if ( nLen < 0 )      {         fclose(fp);         close(socketsd);         return -1;      }      if ( nLen == 0 )      {         fclose(fp);         close(socketsd);         break;      }      //if (write(socketsd,sSerbuf,strlen(sSerbuf)) <0)      if ( write( socketsd, sSerbuf, nLen )  < 0 )      {         printf("write error!\n");         close(socketsd);         fclose(fp);         return (-1);      }      memset(sSerbuf,0,BUF_LEN);   }    printf("\n文件传送完毕.\n");   fclose(fp);   close(socketsd);   return 0;} /* *  Quitset()  -- 设置退出标志  *   *  return  * */int Quitset(int sig){   printf("\nGet signal SIGINT, force quit server\n");   fflush(stderr);   _nQuit = TRUE;   return 0;}/**********************************************  PROGRAM: TcpSer.c                      ****  AUTHOR:  LYC                           ****  COMMENT: FTP服务器  V1.00              ****    实现客户发出请求下载服务端文件的功能 ****    服务器能同时响应多个客户的请求       ****编译方式: cc TcpSer.c -o TcpSer -lsocket **********************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -