免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1489 | 回复: 5
打印 上一主题 下一主题

哪位仁兄帮忙看一下一个简单的通讯问题出在哪里??? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-30 18:32 |只看该作者 |倒序浏览
服务器端:

  1. #include <sys/socket.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <sys/types.h>
  6. #include <arpa/inet.h>
  7. #include <netdb.h>
  8. #include <netinet/in.h>
  9. #include<sys/wait.h>
  10. #include <unistd.h>
  11. #include <stdarg.h>

  12. #define IPADDR  "200.1.1.17"
  13. #define IPPORT  10001
  14. #define MaxCon        100
  15. #define MaxLen        512

  16. void vtcp_log(char * fmt , ...)
  17. {
  18.         char        filename[100];
  19.         FILE        *fp;
  20.         va_list        va;

  21.         memset(filename,0x00,sizeof(filename));
  22.         sprintf(filename,"%s/%s",getenv("LOGDIR"),"server.log");
  23.         fp=fopen(filename,"a");

  24.         va_start(va,fmt);
  25.         vfprintf(fp,fmt,va);
  26.         fclose(fp);
  27.         va_end(va);
  28. }


  29. int main(int argc,char **argv)
  30. {
  31.         char        hostname[256];
  32.         struct        hostent        * hostinfo;
  33.         char         *host,**names,**addrs;
  34.         struct        sockaddr_in        srv_addr,cli_addr;
  35.         int                sock_id,cli_sock_id,len;
  36.         int                forkpid;
  37.         char        buf[512];
  38.         int                buflen;

  39.         memset(&srv_addr,0x00,sizeof(struct sockaddr_in));
  40.         srv_addr.sin_family=AF_INET;
  41.         srv_addr.sin_addr.s_addr=inet_addr(IPADDR);
  42.         srv_addr.sin_port=htons(IPPORT);
  43.        
  44.         sock_id=socket(AF_INET,SOCK_STREAM,0);
  45.         if (sock_id==-1){
  46.                 vtcp_log("socket error \n");
  47.                 return 1;
  48.         }
  49.         if (bind(sock_id,(struct sockaddr *)&srv_addr,sizeof(srv_addr))<0){
  50.                 vtcp_log("bind error \n");
  51.                 return 1;
  52.         }
  53.         if (listen(sock_id,5)<0){
  54.                 vtcp_log("listen error !!!\n");
  55.                 return 1;
  56.         }
  57.         while(1){
  58.                 memset(&cli_addr,0x00,sizeof(struct sockaddr_in));
  59.                 len=sizeof(cli_addr);
  60.                 cli_sock_id=accept(sock_id,(struct sockaddr *)&cli_addr,(socklen_t *)&(len));
  61.                 if (cli_sock_id<0){
  62.                         vtcp_log("accept error \n");
  63.                         continue;
  64.                 } else {
  65.                         vtcp_log("cli_addr-->addr[%d]\n",cli_addr.sin_addr);
  66.                         vtcp_log("cli_addr-->port[%d]\n",cli_addr.sin_port);
  67.                 }
  68.                 if (fork()==0){
  69.                         close(sock_id);
  70.                         memset(buf,0x00,sizeof(buf));
  71.                         buflen=read(cli_sock_id,buf,MaxLen);
  72.                         if (buflen==-1){
  73.                                 vtcp_log("recv error \n");
  74.                                 return 0;
  75.                         } else if (buflen>0) {
  76.                                 vtcp_log("databuf is [%s]\n",buf);
  77.                         } else {
  78.                                 break;
  79.                         }
  80.                         memset(buf,0x00,sizeof(buf));
  81.                         strcpy(buf,"this is a test one");
  82.                         write(cli_sock_id,buf,MaxLen);
  83.                         memset(buf,0x00,sizeof(buf));
  84.                         strcpy(buf,"this is a test two");
  85.                         write(cli_sock_id,buf,MaxLen);
  86.                         close(cli_sock_id);
  87.                         exit(0);
  88.                 } else {
  89.                         close(cli_sock_id);
  90.                 }
  91.         }
  92. }
复制代码


客户端


  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<errno.h>
  4. #include<string.h>
  5. #include<netdb.h>
  6. #include<sys/types.h>
  7. #include<netinet/in.h>
  8. #include<sys/socket.h>
  9. #define SERVPORT 10001
  10. #define MAXDATASIZE 100;
  11. main()
  12. {
  13.   int sockfd,sendbytes;
  14.   char buf[100];
  15.   struct sockaddr_in serv_addr;
  16.   if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
  17.   {
  18.       perror("create socket Error!");
  19.       exit(1);
  20.   }
  21.   serv_addr.sin_family = AF_INET;
  22.   serv_addr.sin_port = htons(SERVPORT);
  23.   serv_addr.sin_addr.s_addr = inet_addr("200.1.1.17");
  24.   bzero(&(serv_addr.sin_zero),8);
  25.   if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
  26.   {
  27.       perror("connect Error!");
  28.       exit(1);
  29.   }
  30.   memset(buf,0x00,sizeof(buf));
  31.   strcpy(buf,"cli 1");
  32.   write(sockfd,buf,sizeof(buf));
  33.   memset(buf,0x00,sizeof(buf));
  34.   strcpy(buf,"cli 2");
  35.   write(sockfd,buf,sizeof(buf));
  36.   memset(buf,0x00,sizeof(buf));
  37.   read(sockfd,buf,512);
  38.   printf("%s\n",buf);
  39.   close(sockfd);
  40.   exit (0);
  41. }

复制代码


运行的时候出错:
accept的时候没有报错,但是read的时候出错!!
这是log里面的内容
cli_addr-->addr[0]
cli_addr-->port[45037]
cli_sock_id is [4]
recv error

[ 本帖最后由 zzw3206 于 2006-7-30 18:52 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-07-30 18:37 |只看该作者
if (buflen=-1)

论坛徽章:
0
3 [报告]
发表于 2006-07-30 18:46 |只看该作者
我晕,,这眼神不行啊,,看了很多边就是没有看出来啊!!
还有一些不明白的地方啊:
在客户端write了2次,但在服务器端为什么没有显示第二次write的呢??也需要read两次吗
还有就是客户端也只是收到服务器端的第一次write。

[ 本帖最后由 zzw3206 于 2006-7-30 18:55 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-07-30 19:12 |只看该作者
如果经常犯这个错,建议-1写前面

论坛徽章:
0
5 [报告]
发表于 2006-07-31 09:33 |只看该作者
原帖由 zzw3206 于 2006-7-30 18:46 发表
我晕,,这眼神不行啊,,看了很多边就是没有看出来啊!!
还有一些不明白的地方啊:
在客户端write了2次,但在服务器端为什么没有显示第二次write的呢??也需要read两次吗
还有就是客户端也只是收到服务器端 ...

客户端第一次write后,服务端的read就返回了,没读你的第二次write.另外的同理.

PS:建议仔细看看书,理解一下基本知识

论坛徽章:
0
6 [报告]
发表于 2006-07-31 10:58 |只看该作者

  1.          while(1)
  2.          {
  3.                         memset(buf,0x00,sizeof(buf));
  4.                         buflen=read(cli_sock_id,buf,MaxLen);
  5.                         if (buflen==-1){
  6.                                 vtcp_log("recv error \n");
  7.                                 return 0;
  8.                         } else if (buflen>0) {
  9.                                 vtcp_log("databuf is [%s]\n",buf);
  10.                         } else {
  11.                                 break;
  12.                         }
  13.          }
复制代码

这样就可以收到全部的收到。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP