CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  程序开发区

LINUX下C/S编程问题

楼主Old123()2006-03-09 12:53:32 在 Linux/Unix社区 / 程序开发区 提问

本人因需要,需要写一个linux下的双机通讯程序,用tcp协议传送数据。      
  服务器上的应用程序如下:      
  #include     <sys/types.h>      
  #include     <sys/socket.h>          
  #include     <linux/in.h>      
  #include     <linux/inet.h>      
  #include     <stdio.h>      
  #include     <string.h>      
  #include     <stdlib.h>      
  #define     MY_PORT     2100      
     
  void     main()      
  {      
        int     sock_serv,new_fd;      
        unsigned     int     sin_size;      
        struct     sockaddr_in     host_addr,remo_addr;      
        sock_serv=socket(AF_INET,SOCK_STREAM,0);/*主机建立socket*/      
        if(sock_serv!=-1)      
        printf("Socket     created     OK\n");      
        else          
        exit(1);      
        host_addr.sin_family=AF_INET;/*初始化主机socket地址*/      
        host_addr.sin_addr.s_addr=htonl(INADDR_ANY);      
        host_addr.sin_port=htons(MY_PORT);      
        bzero(&(host_addr.sin_zero),8);      
        if(bind(sock_serv,(struct     sockaddr     *)&host_addr,sizeof(struct     sockaddr))!=-1)      
        printf("Binded     OK\n");      
        else      
        exit(1);      
        if(listen(sock_serv,1)!=-1)      
        printf("listening\n");      
        else          
                            exit(1);      
        while(1){      
                    sin_size     =     sizeof(struct     sockaddr);      
                        new_fd     =     accept(sock_serv,     (struct     sockaddr     *)&remo_addr,     &sin_size);      
                        if(new_fd!=-1){      
                                    printf("Acepted     OK\n");      
                                    printf("server:     got     connection     from     %s\n",     inet_ntoa(remo_addr.sin_addr));}      
                            else          
                            exit(1);      
        }      
  }      
  客户端上的程序如下:      
  #include     <sys/types.h>      
  #include     <sys/socket.h>          
  #include     <linux/in.h>      
  #include     <linux/inet.h>      
  #include     <stdio.h>      
  #include     <string.h>      
  #include     <stdlib.h>      
  void     main()      
  {      
                    int     sock_cli;      
                    struct     sockaddr_in     serv_addr;      
                    sock_cli=socket(AF_INET,SOCK_STREAM,0);      
                        if(sock_cli!=-1)      
                                                printf("Socket     created     OK\n");      
                    else     exit(1);      
                    serv_addr.sin_family=AF_INET;      
                    serv_addr.sin_port=2100;      
                    serv_addr.sin_addr.s_addr=htonl(inet_addr("127.0.0.1"));      
                    bzero(&(serv_addr.sin_zero),8);      
                    if(connect(sock_cli,(struct     sockaddr     *)&serv_addr,sizeof(struct     sockaddr))!=-1){      
                                printf("Connected     OK\n");      
                                        }      
                            else     exit(1);      
  }      
  为调试程序,在linux上开两个终端,分别运行服务器程序和客户端程序,以实现本机发送,本机接收。但服务器没有客户端连接,客户端也连不上服务器。郁闷啊!希望大虾指点迷津,谢谢 问题点数:30、回复次数:13Top

1 楼fierygnu(va_list)回复于 2006-03-09 13:43:46 得分 10

客户端serv_addr.sin_port=2100;为什么不htons?Top

2 楼Old123()回复于 2006-03-09 16:38:50 得分 0

试过了,还是不行Top

3 楼fierygnu(va_list)回复于 2006-03-09 17:02:32 得分 0

inet_addr返回的就是网络字节序,不能再htonl了   :)Top

4 楼bm1408(向va_list学习~不用VC好多年~)回复于 2006-03-09 18:28:20 得分 0

查看一下你地址的IP地多少?Top

5 楼Old123()回复于 2006-03-09 19:43:57 得分 0

我的地址是192.168.1.101,这个我也试过了,不行啊!  
  Top

6 楼fierygnu(va_list)回复于 2006-03-09 19:47:34 得分 0

?还不行?Top

7 楼Old123()回复于 2006-03-11 00:35:52 得分 0

是的啊,太郁闷了,请达人赐教Top

8 楼fierygnu(va_list)回复于 2006-03-11 01:41:25 得分 0

inet_addr返回的就是网络字节序,不能再htonl了   :)  
  ==  
  这个改了吗?Top

9 楼FindFullMoon(寻找自己)回复于 2006-03-11 03:37:37 得分 0

要不然看看   防火墙?  
  也不一定非要是程序本身的问题吧.Top

10 楼linuxghs()回复于 2006-03-19 19:11:36 得分 0

serv_addr.sin_port=2100;     ?????  
  看看吧Top

11 楼Jamesonang(珍惜生命,远离网络)回复于 2006-03-20 13:42:40 得分 10

1.   使用   bzero   函数处理     struct   sockaddr_in   结构  
  在你给   struct   sockaddr_in   结构填充数据之前,使用   bzero   函数  
  例如,在你的   server   程序中,  
  。。。  
  bzero(&host_addr,   sizeof(hostaddr))   ;   /*加上这一行*/  
  host_addr.sin_family=AF_INET;/*初始化主机socket地址*/    
  。。。  
   
  同样的问题出现在你的客户端程序。    
   
  2。   使用htonl   或htons函数使你的程序使用   network   endianness    
  在你的客户端程序中,serv_addr.sin_port=2100;   应该该为   serv_addr_port   =   htons(2100);  
     
  3.   inet_addr   函数返回的是   network   endianness   不需要   htonl    
   
  你应该把你错误信息贴出来!   1,2   错误可能是致命的,导致你的程序不能正常工作,3不是。Top

12 楼bjpy2005(冰城的神话)回复于 2006-03-22 03:11:27 得分 10

1.bzero函数应该在你对serv_addr初始化之前调用。这是最主要的问题,你每次都在赋值以后又调用bzero清零了,等于没有赋值。:)  
        服务器端:  
                bzero(&serv_addr,sizeof(serv_addr));  
                serv_addr.sin_family=AF_INET;  
                serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);  
                serv_addr.sin_port=htons(MY_PORT);  
      客户端:  
                bzero(&serv_addr,sizeof(serv_addr));  
                serv_addr.sin_family=AF_INET;  
                serv_addr.sin_port=htons(MY_PORT);  
                serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");  
    2.   listen的原型为listen(int   fd,   int   backlog)  
            建议以后在编程序过程中,不要显式指定   backlog的大小,因为listen函数拥有两个queue,一个是An   complete   connection   queue,另一个是A   complete   connection   queue。对于backlog的大小表示的含义没有正式的说法,一般定义为这两个queue的元素数目之和。但是在不同的平台上backlog表示的意义不一样,例如,backlog=0,在MacOS   10.2.6上表示1,在Linux2.4.7上表示3;backlog=1,在MacOS   10.2.6上表示2,在Linux2.4.7上表示4。  
            所以,下次写程序时候,用环境变量LISTENQ代替具体的backlog数值,采用如下调用:  
                              listen(sock_serv,LISTENQ);  
  或者定义自己的Listen函数,将listen函数封装在内,如下:  
            void  
            Listen(int   fd,   int   backlog)  
                {  
                          char   *ptr;  
   
                          if((ptr=getenv("LISTENQ"))   !=   NULL)  
                                  backlog=atoi(ptr);  
   
                          if(listen(fd,backlog)   <   0)  
                                  err_sys("listen   error");  
                  }  
   
   
  Top

13 楼Old123()回复于 2006-03-25 09:46:49 得分 0

问题解决,多谢大家的鼎力相助Top

相关问题

  • linux下的c++编程
  • linux下的c 编程
  • 在linux下怎么用c、c++编程?
  • Linux下C/C++编程好书推荐!
  • Linux下C编程的问题?
  • LINUX下可以用C++编程么???
  • 诚交LINUX下C++编程人员
  • 关于Linux下的C++编程
  • 关于linux下C编程的问题
  • Linux 下C语言编程问题!

关键词

  • 函数
  • 客户
  • 服务器
  • 主机
  • serv
  • addr
  • sin
  • bzero
  • backlog
  • 程序

得分解答快速导航

  • 帖主:Old123
  • fierygnu
  • Jamesonang
  • bjpy2005

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo