免费注册 查看新帖 |

Chinaunix

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

connect连接问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-01 09:32 |只看该作者 |倒序浏览
下面是一个客户端的代码,现在的问题是在第一次写入,可从服务端返回,第二次就没有反应了,一直停留在那里等待,怎么回事, 下面的代码有错吗,还是服务端的问题,服务端的代码为读取客户发过来的信息,再返回该信息。



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <netinet/in.h>

int main(int argc, char **argv)
{
  struct sockaddr_in servaddr;
  int sockfd, len;
  char buf[1024];

  if(argc != 2)
  {
     printf("Useage: %s ipaddress\n", argv[0]);
     exit(1);
  }
  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  if(sockfd < 0)
  {
     perror("socket");
     exit(1);
  }
  bzero(&servaddr, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = inet_addr(argv[1]);
  servaddr.sin_port = htons(4000);
  if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
  {
     perror("connect");
     exit(1);
  }
  while(1)
  {
     memset(buf, 0, 1024);
     printf("input:");
     scanf("%s", buf);
     if(send(sockfd, buf, sizeof(buf), 0) < 0)
     {
        perror("send");
        exit(1);
     }
     memset(buf, 0, 1024);
     len = read(sockfd, buf, sizeof(buf));
     printf("Message from server: %s\n", buf);
  }
  close(sockfd);

  return 0;
}

论坛徽章:
0
2 [报告]
发表于 2009-03-01 09:48 |只看该作者
原帖由 kggg 于 2009-3-1 09:32 发表
下面是一个客户端的代码,现在的问题是在第一次写入,可从服务端返回,第二次就没有反应了,一直停留在那里等待,怎么回事, 下面的代码有错吗,还是服务端的问题,服务端的代码为读取客户发过来的信息,再返回 ...


if(send(sockfd, buf, sizeof(buf), 0) < 0)
.....
不建议这么写!

论坛徽章:
0
3 [报告]
发表于 2009-03-01 09:53 |只看该作者
原帖由 system888net 于 2009-3-1 09:48 发表


if(send(sockfd, buf, sizeof(buf), 0) < 0)
.....
不建议这么写!


嗯, 那怎么写
用write吗

论坛徽章:
0
4 [报告]
发表于 2009-03-01 10:09 |只看该作者
原帖由 kggg 于 2009-3-1 09:53 发表


嗯, 那怎么写
用write吗


那倒不是.
这个程序在用scanf(...)的条件下是能正确运行的(前提是buf不能满),建议你检查以下server端的代码.


指的是另外一个方面:
从你的这段程序里可以看出:
     1.  你用的协议是定长段发送和定长段接收.  //见 send(sockfd, buf, sizeof(buf), 0)  和 read(sockfd, buf, sizeof(buf))
     2.  你交换的信息只限于文本.           //见 printf("Message from server: %s\n", buf);
  
   
那么从程序的思想来看,buf是1024个byte,一般而言scanf("%s", buf) 不会使buf占满. 但至少从程序逻辑来看,没有判断buf满了如何处理,
也就是要严格保证buf中有0x00字符.你这里是事前用了memset(buf,0x00,sizeof(buf)来保证了0x00字符,但不是事后,对于printf(...),buf中的0x00是必须要保证的.
而对于这句:
len=read(sockfd, buf, sizeof(buf))
printf("Message from server: %s\n", buf);
注意并不能保证一次过来的数据一定是sizeof(buf)长的,也即len=sizeof(buf)不一定满足,那么数据就会有遗留,你还要处理余下的,直到收完定长的数据包sizeof(buf)后才能算接收完毕.

[ 本帖最后由 system888net 于 2009-3-1 10:10 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-03-01 16:36 |只看该作者
看一下server端怎么处理的?

论坛徽章:
0
6 [报告]
发表于 2009-03-01 21:59 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2009-03-01 22:23 |只看该作者
这个要配合服务端来看才行,你确定你第二次SEND成功了? 不动了有可能出现在scanf和 read这两个地方。

论坛徽章:
0
8 [报告]
发表于 2009-03-02 10:30 |只看该作者
下面是服务端的代码:
  while(1)
  {
      char temp[1024];
      int len;
      bzero(&clientaddr, sizeof(clientaddr));
      socklen_t client_len = sizeof(clientaddr);

      client_fd = accept(sock_fd, (struct sockaddr *)&clientaddr, &client_len);
      if(client_fd < 0)
      {
         perror("error accept");
         break;
      }
      bzero(&temp, sizeof(temp));
      len = read(client_fd, &temp, sizeof(temp));

      write(client_fd, &temp, sizeof(len));
  }

论坛徽章:
0
9 [报告]
发表于 2009-03-02 11:16 |只看该作者
下面是服务端的代码:
  while(1)
  {
      char temp[1024];
      int len;
      bzero(&clientaddr, sizeof(clientaddr));
      socklen_t client_len = sizeof(clientaddr);

      client_fd = accept(sock_fd, (struct sockaddr *)&clientaddr, &client_len);
      if(client_fd < 0)
      {
         perror("error accept");
         break;
      }
      bzero(&temp, sizeof(temp));
      len = read(client_fd, &temp, sizeof(temp));

      write(client_fd, &temp, sizeof(len)); /////////////////////////--------sizeof(len)的长度只有四个字节,客户端recv的长度是sizeof(buf)没有满足他需要的字节数,当然堵在那了
  }

论坛徽章:
0
10 [报告]
发表于 2009-03-02 11:33 |只看该作者
原帖由 kggg 于 2009-3-2 10:30 发表
下面是服务端的代码:
  while(1)
  {
      char temp[1024];
      int len;
      bzero(&clientaddr, sizeof(clientaddr));
      socklen_t client_len = sizeof(clientaddr);

      client_fd = ...




while(1)
  {
      char temp[1024];
      int len;
      bzero(&clientaddr, sizeof(clientaddr));
      socklen_t client_len = sizeof(clientaddr);

//第二次是卡在这里了(accept),因为client端只connect了一次
      client_fd = accept(sock_fd, (struct sockaddr *)&clientaddr, &client_len);
      if(client_fd < 0)
      {
         perror("error accept";
         break;
      }
      bzero(&temp, sizeof(temp));
      len = read(client_fd, &temp, sizeof(temp));  

      write(client_fd, &temp, sizeof(len));
  }

[ 本帖最后由 system888net 于 2009-3-2 11:34 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP