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

大家看看小弟我的程序,多谢(80),先给20,解决后再给60

2012-03-06 
大家看看我的程序,谢谢(80),先给20,解决后再给60下面是小弟写的一个SOCKET程序,但是假如通过windows下的客

大家看看我的程序,谢谢(80),先给20,解决后再给60
下面是小弟写的一个SOCKET程序,但是假如通过windows下的客户端连接他,并发送数据,它可以显示有客户端连接进来,但无法收到客户端发来的数据.怎么会事.谢谢大家.

#include   <sys/types.h>
#include   <sys/socket.h>
#include   <sys/time.h>
#include   <netinet/in.h>
#include   <stdio.h>
#include   <strings.h>
#include   <string.h>
#include   <errno.h>
#include   <arpa/inet.h>
#include   <stdlib.h>
#include   <unistd.h>
#include   <signal.h>
#include   <sys/wait.h>

#define   SA   struct   sockaddr
#define   MAXCLI   20
#define   MAXLINE     4096     /*   max   text   line   length   */
#define   LISTENQ   1024         /*   2nd   argument   to   listen()   */

void   sig_chld(int   signo)
{
        pid_t   pid;
        int   stat;
        while((pid   =   waitpid(-1,&stat,WNOHANG))> 0)
                printf( "chile   %d   terminated\n ",pid);
        return;
}

void   myWork(int   sockfd   )
{
        ssize_t   n=0;
        char   buf[1025];
        fd_set   rset;
        struct   timeval   timeout;
        timeout.tv_sec=2;
        timeout.tv_usec=0;
       
        bzero(&buf,sizeof(buf));
        printf( "i   am   in   myWork ");
    again:
                    while((n=read(sockfd,buf,1024))> 0)
                    {
                            printf( "[%d]   the   message   is:   %s ",getpid(),buf);
                            bzero(&buf,sizeof(buf));
                            //write(sockfd, "hello   client1\n ",sizeof( "hello   client1\n "));
                    }
                    if(n <0   &&   errno==EINTR)
                            goto   again;
                    else   if   (n <0)
                            printf( "str_echo:   read   error ");
    /*       FD_ZERO(&rset);
                    FD_SET(sockfd,&rset);
                    select(sockfd+1,&rset,NULL,NULL,&timeout);
                    if   (FD_ISSET(sockfd,&rset))


                    {
                    n   =   read(sockfd,(void*)buf,1024);
                    printf( "the   n   is:   %d\n ",   n);
                    printf( "the   content   is:   %s\n ",buf);      
}
                    else
                    printf( "no   \n ");*/
                           
}
int   setIP(sockaddr_in&   sock_addr,   char*   IP_Addr,   int   port)
{
        bzero(&sock_addr,sizeof(sock_addr));
        sock_addr.sin_family   =   AF_INET;
        sock_addr.sin_port   =   htons(port);
        inet_pton(AF_INET,IP_Addr,   &sock_addr.sin_addr);        
}

int   main(int   argc,   char   *argv[])
{        
      //   printf( "begin   get   remote   url....\n ");
      //   xml_Parser   myParser   =   xml_Parser( "http://192.168.103.67 ");
        sockaddr_in   server_addr,cli_addr;
        int   listenfd,clifd;
        socklen_t   len;
        pid_t   childpid;
        int   n,flag=1;
        char*   buf;
       
        printf( "begin   connect...\n ");
        setIP(server_addr, "192.168.103.64 ",9000);
       
        listenfd   =   socket(AF_INET,SOCK_STREAM,0);
        if(   setsockopt(listenfd,   SOL_SOCKET,   SO_REUSEADDR,   &flag,   len)   ==   -1)  
        {  
                perror( "setsockopt ");  
                exit(1);  
        }  
       
        bind(listenfd,(struct   sockaddr*)&server_addr,sizeof(server_addr));
        listen(listenfd,LISTENQ);
       
       
        //Signal(SIGCHLD,sig_chld);
       
        for(;;)
        {
                len   =   sizeof(cli_addr);
                printf( "wait   for   connect\n ");
                if((clifd   =   accept(listenfd,(struct   sockaddr*)&cli_addr,&len) <0))  
                {
                        if   (errno   ==   EINTR)


                                continue;
                        else
                                //err_sys( "accept   error ");
                                printf( "accept   error ");
                        printf( "error ");

                }
                       
                printf( "the   IP   is:%s\n ",inet_ntoa(cli_addr.sin_addr));
                printf( "the   Port   is:   %d\n ",ntohs(cli_addr.sin_port));                
                printf( "have   a   connect\n ");
                myWork(clifd);
 
                if((childpid=fork())==0)
                {
                        printf( "begin   myWork1\n ");
                        close(listenfd);
                        printf( "begin   myWork2\n ");
                        myWork(clifd);
                        printf( "begin   myWork3\n ");
                        exit(0);
                }
                if   (childpid <0)
                        printf( "fork   error\n ");
               
                printf( "hello   over\n ");
                close(clifd);
        }
       
       
}

[解决办法]
看了半天你的程序,实在难看~~


注释太少了~~~~~~哎~~~~~~估计楼主应该是个新手~~至少在写程序方面~~~
[解决办法]
你怎么有两个myWork,第一个会停在那里,等到收到数据应该会打出来。
myWork(clifd);

if((childpid=fork())==0)
{
printf( "begin myWork1\n ");
close(listenfd);
printf( "begin myWork2\n ");
myWork(clifd);
printf( "begin myWork3\n ");
exit(0);
}
if (childpid <0)
printf( "fork error\n ");

printf( "hello over\n ");
close(clifd);

假设你没有第一个myWork,才会启动子进程,里面调用myWork,这时,你的main主线程可能在子进程收到数据之前将clifd关闭。这样子就永远看不到数据了。
------解决方案--------------------


main里面好乱, 看到这样的程序头就大了.
[解决办法]
关注!

热点排行