LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1056|回复: 5

学习 SOCKET编成 ,写了个小程序 在线FORTUNE

[复制链接]
发表于 2003-12-1 15:16:51 | 显示全部楼层 |阅读模式
在线FORTUNE

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2003-12-9 19:59:45 | 显示全部楼层

能不能介绍一下这个程序呢~

~~
发表于 2003-12-9 21:20:25 | 显示全部楼层
我一运行 ./test 说:段错误
os : debian
 楼主| 发表于 2003-12-12 10:04:01 | 显示全部楼层

  1. #include "unp.h"
  2. #include <sys/param.h>
  3. #define PORT 1983
  4. main()
  5. {
  6.         start_daemon();
  7.         int i,maxi,maxfd,listenfd,connfd,sockfd;
  8.         int clilen;
  9.         struct sockaddr_in cliaddr,servaddr;
  10.         listenfd=socket(AF_INET,SOCK_STREAM,0);
  11.         bzero(&servaddr,sizeof(servaddr));
  12.         servaddr.sin_family=AF_INET;
  13.         servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  14.         servaddr.sin_port=htons(PORT);

  15.         bind(listenfd,(SA *)&servaddr,sizeof(servaddr));
  16.         listen(listenfd,5);

  17.         while(1)
  18.         {
  19.                 connfd=accept(listenfd,(SA *)&cliaddr,&clilen);

  20.                 if(fork()==0)
  21.                 {
  22.                         close(listenfd);
  23.                         server(connfd);
  24.                         exit(0);
  25.                 }
  26.                 close(connfd);
  27.         }
  28. }





  29. int server(int sockfd)
  30. {
  31.         char recvline[1024];
  32.         char sendmes[4096];
  33.         FILE *fd;      
  34.         read(sockfd,recvline,1024);
  35.         if(strncmp(recvline,"fortune",7)==0)
  36.         {
  37.                 fd=popen("fortune","r");
  38.                 fread(sendmes,sizeof(char),4096/*sizeof(sendmes)*/,fd);
  39. //              read(fileno(fd),sendmes,sizeof(sendmes));
  40.                 write(sockfd,sendmes,strlen(sendmes));
  41.                 pclose(fd);
  42.                 close(sockfd);
  43.                 //执行FORTUNE
  44.                 return 1;
  45.         }
  46.         else if(strncmp(recvline,"zhfortune",9)==0)
  47.         {
  48.                 fd=popen("fortune-zh","r");
  49.                 fread(sendmes,sizeof(char),4096/*sizeof(sendmes)*/,fd);
  50. //              read(fd,sendmes,sizeof(sendmes));
  51.                 write(sockfd,sendmes,strlen(sendmes));
  52.                 pclose(fd);
  53.                 close(sockfd);
  54.                 //执行fortune-zh
  55.                 return 2;
  56.         }
  57.         close(sockfd);
  58.         return -1;
  59. }





  60. start_daemon()
  61. {
  62.         int i,fd;
  63.         for(i=0;i<NOFILE;++i)
  64.                 close(i);
  65.         if((fd=open("/dev/tty",O_RDWR))>0)
  66.         {
  67.                 ioctl(fd,ENOTTY,0);
  68.                 close(fd);
  69.         }

  70.         if(fork())
  71.                 exit(0);
  72.         
  73.         setsid();
  74.         chdir("/tmp");
  75.         umask(0);
  76.         signal(SIGCHLD,SIG_IGN);
  77. }
复制代码
 楼主| 发表于 2003-12-12 10:07:04 | 显示全部楼层

  1. import java.net.*;
  2. import java.io.*;
  3. import javax.swing.*;



  4. /**
  5. *
  6. * @author  neil
  7. */
  8. public class OLF extends javax.swing.JFrame {
  9.    
  10.     /** Creates new form OLF */
  11.     public OLF() {
  12.         initComponents();
  13.     }
  14.    
  15.     /** This method is called from within the constructor to
  16.      * initialize the form.
  17.      * WARNING: Do NOT modify this code. The content of this method is
  18.      * always regenerated by the Form Editor.
  19.      */
  20.     private void initComponents() {//GEN-BEGIN:initComponents
  21.         jScrollPane1 = new javax.swing.JScrollPane();
  22.         tf_text = new javax.swing.JTextArea();
  23.         jButton1 = new javax.swing.JButton();
  24.         jButton2 = new javax.swing.JButton();
  25.         menuBar = new javax.swing.JMenuBar();
  26.         fileMenu = new javax.swing.JMenu();
  27.         exitMenuItem = new javax.swing.JMenuItem();
  28.         helpMenu = new javax.swing.JMenu();
  29.         aboutMenuItem = new javax.swing.JMenuItem();

  30.         getContentPane().setLayout(null);

  31.         setTitle("FortuneOnline");
  32.         setResizable(false);
  33.         addWindowListener(new java.awt.event.WindowAdapter() {
  34.             public void windowClosing(java.awt.event.WindowEvent evt) {
  35.                 exitForm(evt);
  36.             }
  37.         });

  38.         jScrollPane1.setViewportView(tf_text);

  39.         getContentPane().add(jScrollPane1);
  40.         jScrollPane1.setBounds(10, 10, 450, 310);

  41.         jButton1.setText("Fortune");
  42.         jButton1.addActionListener(new java.awt.event.ActionListener() {
  43.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  44.                 jButton1ActionPerformed(evt);
  45.             }
  46.         });

  47.         getContentPane().add(jButton1);
  48.         jButton1.setBounds(470, 20, 90, 25);

  49.         jButton2.setText("Poem");
  50.         jButton2.addActionListener(new java.awt.event.ActionListener() {
  51.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  52.                 jButton2ActionPerformed(evt);
  53.             }
  54.         });

  55.         getContentPane().add(jButton2);
  56.         jButton2.setBounds(470, 60, 68, 25);

  57.         fileMenu.setText("File");
  58.         exitMenuItem.setText("Exit");
  59.         exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
  60.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  61.                 exitMenuItemActionPerformed(evt);
  62.             }
  63.         });

  64.         fileMenu.add(exitMenuItem);
  65.         menuBar.add(fileMenu);
  66.         helpMenu.setText("Help");
  67.         aboutMenuItem.setText("About");
  68.         aboutMenuItem.addActionListener(new java.awt.event.ActionListener() {
  69.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  70.                 aboutMenuItemActionPerformed(evt);
  71.             }
  72.         });


  73.         helpMenu.add(aboutMenuItem);
  74.         menuBar.add(helpMenu);
  75.         setJMenuBar(menuBar);

  76.         pack();
  77.         java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
  78.         setSize(new java.awt.Dimension(562, 378));
  79.         setLocation((screenSize.width-562)/2,(screenSize.height-378)/2);
  80.     }//GEN-END:initComponents

  81.     private void aboutMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_aboutMenuItemActionPerformed
  82.         
  83.         // Add your handling code here:
  84.     }//GEN-LAST:event_aboutMenuItemActionPerformed

  85.     private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
  86.         getmsg("zhfortune");
  87.         
  88.         // Add your handling code here:
  89.     }//GEN-LAST:event_jButton2ActionPerformed

  90.     private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
  91.         getmsg("fortune");
  92.         
  93.         // Add your handling code here:
  94.     }//GEN-LAST:event_jButton1ActionPerformed
  95.    
  96.     private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
  97.         System.exit(0);
  98.     }//GEN-LAST:event_exitMenuItemActionPerformed
  99.    
  100.     /** Exit the Application */
  101.     private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
  102.         System.exit(0);
  103.     }//GEN-LAST:event_exitForm
  104.    
  105.     /**
  106.      * @param args the command line arguments
  107.      */
  108.     public static void main(String args[]) {
  109.         new OLF().show();
  110.     }
  111.    
  112.     public static void getmsg(String cmd)
  113.     {
  114.         
  115.         Socket sock;
  116.         InputStream Is;
  117.         OutputStream Os;
  118.         DataInputStream DIS;
  119.         PrintStream PS;
  120.         tf_text.setText("");
  121.         try{
  122.             sock=new Socket("211.87.233.152",1983);
  123.             Is=sock.getInputStream();
  124.             Os=sock.getOutputStream();
  125.             DIS=new DataInputStream(Is);
  126.             PS=new PrintStream(Os);
  127.             DataInputStream in=new DataInputStream(System.in);
  128.             PS.println(cmd);
  129.             msg=DIS.readLine();
  130.             while(msg.compareTo("")!=0)
  131.             {
  132.                 tf_text.append(msg+"\n");
  133.                 msg=DIS.readLine();
  134.             }
  135.             
  136.         }catch(Exception e){};
  137.     }
  138.    
  139.     public static String msg;
  140.     // Variables declaration - do not modify//GEN-BEGIN:variables
  141.     private javax.swing.JButton jButton2;
  142.     private javax.swing.JScrollPane jScrollPane1;
  143.     private javax.swing.JMenu fileMenu;
  144.     private javax.swing.JMenuItem exitMenuItem;
  145.     private javax.swing.JButton jButton1;
  146.     private javax.swing.JMenuBar menuBar;
  147.     private javax.swing.JMenuItem aboutMenuItem;
  148.     private javax.swing.JMenu helpMenu;
  149.   public static javax.swing.JTextArea tf_text;
  150.     // End of variables declaration//GEN-END:variables
  151.    
  152. }
复制代码
发表于 2004-4-27 13:18:25 | 显示全部楼层

  1.         if(fork())
  2.                 exit(0);
复制代码


这里不安全,不同的系统对进程的调度不同,
我就这样写:

  1.          if(fork()==0)
  2.                  exit(0);
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表