编写了一个客户-服务器通讯程序,为何无法单步调试、

解决方案 »

  1.   

    给的信息也太少了吧。
    至少说明是app不能调还是dll不能调,是线程里面出问题还是socket通讯的时候出问题啊
    连提问都不会啊
      

  2.   

    楼上的,是厦门的泊舟吗? 呵呵,记得我吗?nice to meet u
      

  3.   

    编写了sock程序中,建立了client.cpp,server.cpp文件,里面都有main()
    运行过程应该是先运行server.exe,再运行client.exe,现在问题是,在vc中我要先启动 server.cpp,但我无法单步调试,说好像无debug信息。
      

  4.   

    程序很简单,是最基本的了。相当于helloworld.刚刚开始学。
    我如果想单步调试,却不行。:(help
    1.先建立客户端公共函数文件connect_client.c,作用是建立sock,准备连接服务器端
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <winsock.h>#ifndef INADDR_NONE
    #define INADDR_NONE 0xffffffff
    #endifSOCKET   sockconnect(const char *host,const char *service,const char *transport);/*-------------------------------------------------------------------------
     *connectUDP
     *-------------------------------------------------------------------------
     */
    SOCKET 
    UDPconnect(const char *host,const char *service)
    {
      return  sockconnect(host,service,"udp");   
    }/*-------------------------------------------------------------------------
     *connectTCP
     *-------------------------------------------------------------------------
     */
    SOCKET 
    TCPconnect(const char *host,const char *service)
    {
      return  sockconnect(host,service,"tcp");   
    }/*-------------------------------------------------------------------------
     *
     *-------------------------------------------------------------------------
     */
     SOCKET  
     sockconnect(const char *host,const char *service,const char *transport)
     {
      struct hostent *phe;      /*host information     */
      struct servent *pse;      /* server information  */ 
      struct protoent *ppe;     /*protocol information */
      struct sockaddr_in sin;   /*endpoint IP address  */
      int s, type;              /* socket description  */  memset(&sin,0,sizeof(sin));
      sin.sin_family=AF_INET;
     
      /**** get port number from  service  ****/
      if( pse=getservbyname(service,transport) )
            sin.sin_port=pse->s_port;                             /*  port */  
      else if( (sin.sin_port=htons( (u_short)atoi(service)))==0)
      {
         printf("get server information error \n");
         WSACleanup();
         exit(1);
            }
            
            /**** get IP address from  host name ****/ 
      if(phe=gethostbyname(host)) 
             memcpy(&sin.sin_addr,phe->h_addr,phe->h_length);         /*  host IP address  */
     else if( (sin.sin_addr.s_addr=inet_addr(host))==INADDR_NONE )
       {
         printf("get host IP information error \n");
         WSACleanup();
         exit(1);
            }
            
            /**** get protocol number  from protocol name  ****/
      if( (ppe=getprotobyname(transport))==0)
      {
         printf("get protocol information error \n");
         WSACleanup();
         exit(1);
            }
     
           
      if(strcmp(transport,"udp")==0)
           type=SOCK_DGRAM;
      else
          type=SOCK_STREAM;    
            /**** creat a socket description ****/ 
    s=socket(PF_INET,type,ppe->p_proto);

      if( s==INVALID_SOCKET)
      {
         printf(" creat socket error \n");
         WSACleanup();
         exit(1);
            }
     
      if(  connect(s,(struct sockaddr *)&sin,sizeof(sin))==SOCKET_ERROR  )
       {
         printf("connect socket  error \n");
         WSACleanup();
         exit(1);
            }  return s;
     
     
     }
     ----------------------------------
    2.新建客户端win32控制台工程,文件为client.cpp,并包含上述的客户端公共函数文件.
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <winsock.h>
    #include "connect_client.C"
    #pragma comment(lib,"wsock32")#ifndef INADDR_NONE
    #define INADDR_NONE 0xffffffff
    #endif
    SOCKET  TCPconnect(const char *,const char *);
    void    TCPecho(char *,char *);#define LINELEN   128
    #define WAVERS    MAKEWORD(2,0)
      
    void main(int argc,char *argv[])
    {
      char  *host = "localhost";
      char  *service = "3333";
      WSADATA  wsadata;
      
      switch(argc)
      {
       case  1 :
        host= "localhost";
        break;
       case  2 :
                host=argv[1];
                break;
       case  3:
                host=argv[1];
                service=argv[2];
                break;  
       default:
        printf("argment error\n");
        exit(1);                           
      }  if(WSAStartup(WAVERS,&wsadata)!=0)
      {
            printf("initalize failed\n");  
       WSACleanup();
      exit(1);  
      }
      /********************/
      
      TCPecho(host,service);
      
      /********************/
      WSACleanup();
      exit(0);
    }void    TCPecho(char *host,char *service)
    {
      char     buf[LINELEN+1];
      SOCKET   s;
      int      outchars;
      
      s = TCPconnect(host,service);
      
      while(fgets(buf,sizeof(buf),stdin))
      {
         buf[LINELEN]='\0';
         outchars=strlen(buf);
         send(s,buf,outchars,0);   if(buf[0]=='\n')
            break;
      }
      
      closesocket(s);}
      

  5.   

    --------------------------------------------------------
    3.建立服务器端公共函数文件passive_server.C,作用是建立sock,监听客户端连接。
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <winsock.h>u_short  portbase = 0 ;SOCKET sockserver(const char *service,const char *transport,int qlen); /*-------------------------------------------------------------------
     * udppassive
     *-------------------------------------------------------------------
     */
     SOCKET
     UDPserver(const char *service)  
     {
       return  sockserver(service,"udp",0);   
     }
     
    /*-------------------------------------------------------------------
     * tcppassive
     *-------------------------------------------------------------------
     */
     SOCKET
     TCPserver(const char *service,int qlen)
     {
       return   sockserver(service,"tcp",qlen);
     }
     
    /*-------------------------------------------------------------------
     * 
     *-------------------------------------------------------------------
     */
     SOCKET 
     sockserver(const char *service,const char *transport,int qlen)
     {
      struct  servent  *pse;    /* server information    */
       struct  protoent *ppe;    /* proto information     */
        struct sockaddr_in sin;   /* endpoint IP address   */
        int  s,type;              /* socket description    */
       
        memset(&sin,0,sizeof(sin));
        sin.sin_family=AF_INET;
        sin.sin_addr.s_addr = INADDR_ANY;
       
            /* get portnumber from  service name    */
       if(pse=getservbyname(service,transport) )
       sin.sin_port=htons(ntohs((u_short)pse->s_port));
      else  if( (sin.sin_port=htons((u_short)atoi(service)))==0)
      {
         printf("  get portnumber error \n");
         WSACleanup();
         exit(1);
            }
            
            /* get protocol number from protocol name */
       if((ppe=getprotobyname(transport))==0)
        {
         printf("  get protocol number error \n");
         WSACleanup();
         exit(1);
            }
     
            /* choose socket type    */ 
       if(strcmp(transport,"udp")==0)
          type=SOCK_DGRAM;
       else
          type=SOCK_STREAM;
      
       s=socket(PF_INET,type,ppe->p_proto);
      if( s==INVALID_SOCKET)
      {
         printf(" creat socket error \n");
         WSACleanup();
         exit(1);
            }
       
      if(bind(s,(struct sockaddr *)&sin,sizeof(sin))==SOCKET_ERROR ) 
         {
         printf("  socket bind error \n");
         WSACleanup();
         exit(1);
         }
     
     
      if(type==SOCK_STREAM && listen(s,qlen)==SOCKET_ERROR)  
         {
          printf("  socket listen error \n");
          WSACleanup();
          exit(1);
            } return s; 
     }
    ---------------
    4.新建一个win32工程,添加服务器端主函数文件server.cpp
    #include <winsock.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include "passive_server.C"
    #pragma comment(lib,"wsock32")#define QLEN   5
    #define BUFSIZE  2048
    #define WAVERS    MAKEWORD(2,0)SOCKET  TCPserver(const char *service,int qlen);void main(int argc,char *argv[])
    {
        char    *service = "3333";
        struct   sockaddr_in fsin;
        SOCKET   msock,ssock;    
        WSADATA  wsadata;
        int      alen,cc;
        char     buf[BUFSIZE];
        
        switch(argc)
        {
         case 1:
           break;
         case 2:
         service=argv[1];
         break;
         default:
        printf("argment error\n");
        exit(1); 
        }
        
        if(WSAStartup(WAVERS,&wsadata)!=0)
        {
            printf("initalize failed\n");  
       WSACleanup();
      exit(1);  
        }
        
        msock=TCPserver(service,QLEN);
        
        while(1){
         alen=sizeof(struct sockaddr);
         ssock=accept(msock,(struct sockaddr *)&fsin,&alen);
        
         if(ssock==INVALID_SOCKET)    
         {
               printf("initalize failed\n");  
         WSACleanup();
        exit(1);  
         }
         buf[0]='\n'; 
         while( cc=recv(ssock,buf,sizeof(buf)-1,0) ){
              buf[cc]='\0';
              printf("%s",buf);
     
         }
         printf("connect close... ");
         closesocket(ssock);
    break;    }
     
        
    }
    -------------------------------------------
    运行步骤,先运行服务器端文件server.cpp,然后运行客户端文件client.cpp
    在客户端的窗口里输入一些文字,则会在服务器端的窗口里显示。
    连续输入两个回车,则退出程序。
      

  6.   

    ......疑惑ing楼主,为啥都把分给我啊?谢拉!