免费注册 查看新帖 |

Chinaunix

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

又是我 小问题集锦 纯新手 相当简单 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-21 16:39 |只看该作者 |倒序浏览
纯菜鸟问题  

  1. u8 buf[NET_FRAME_LENGTH]
  2. struct linger linger = { 0 };
  3.         linger.l_onoff = 0;
  4.         linger.l_linger = 0;
  5.         status = setsockopt(listenfd,SOL_SOCKET, SO_LINGER,(const char *) &linger,sizeof(linger));
  6. if (-1 == status)
  7.                 {
  8.                             perror("setsockopt(...,SO_LINGER,...)");
  9.                 }
  10.        
  11.         bzero(&servaddr, sizeof(servaddr));
  12.         servaddr.sin_family      = AF_INET;
  13.         servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  14.         servaddr.sin_port        = htons(AUTH_PORT);

  15.         bind(listenfd, (SA *) &servaddr, sizeof(servaddr));

  16.         listen(listenfd, 5);


  17.         for ( ; ; ) {
  18.                 int connfd;
  19.                 clilen = sizeof(cliaddr);
  20.                         printf("87 ok!                listenfd is %d        \n",listenfd);
  21.                 connfd = accept(listenfd, (SA *) &cliaddr, &clilen);
  22.         //slaveSocket = accept(serverSocket,(struct sockaddr *) &clientName, &clientLength);
  23. buf_len = 0;
  24.         while(0<(rc=  read(connfd, &buf[buf_len], NET_FRAME_LENGTH)))//NET_FRAME_LENGTH = 14
  25.         {
  26.                 buf_len += rc;
  27.                 if (NET_FRAME_LENGTH == buf_len)
  28.                 {
  29.                         break;
  30.                 }
  31.         }

  32.         if (buf_len < NET_FRAME_LENGTH)
  33.         {
  34.                 close(connfd);
  35.                 continue;
  36.         }

  37.         write(connfd, buf, NET_FRAME_LENGTH);
  38.         close(connfd);
  39.         }
复制代码




1、(const char *) &linger  linger是个stuct的对象  它变成(const char *)的结果是什么呢   难道是0,0?  已开始的赋值{0} 是什么意思

2、 accept和getpeername的第二个参数都是cliaddr  为什么指针类型不一样

3、 为什么accept的时候不填充cliaddr吗?非要getpeername在填充一次才能获取cliaddr的值?

4、read(connfd, &buf[buf_len], NET_FRAME_LENGTH) 第二个参数为什么不直接写&buf 为什么要写成&buf[buf_len]  还有为什么buf的类型是u8而不是u什么char

5、最后一个问题for ( ; ; )  是不是死循环?如果是为什么不用while(1)?

论坛徽章:
0
2 [报告]
发表于 2007-12-21 18:00 |只看该作者
1. (const char*)&linger 是说取linger这个结构体的地址, 由于现在这个地址是(struct linger*)类型, 而(const char*)就是将这个类型转换成(const char*)类型. 而其值是不变的. 只是类型变了. 而类型变了会造成什么样的影响你可以参考<C专家编程> 这本书.

2. 函数的参数都有其类型, 只是说将这个值转换成了某个类型而已. 其值是不会变的. 这个不一样一般是为了消除警告.

3. accept的时候要填充cliaddr的值.

4. &buf[buf_len] 是取一个地址, 相当于是buf+buf_len的值. 因为u8是指定了8位的, 你一个char有可能不是8位呢, 虽然大多数情况下都是这样的, 但是为了移植性, 采用u8.

5. 是死循环. 个人爱好而已. 没什么特别的!

论坛徽章:
0
3 [报告]
发表于 2007-12-21 18:56 |只看该作者
精辟。。。

论坛徽章:
0
4 [报告]
发表于 2012-11-27 15:37 |只看该作者
我现在集中回复我以前发的SB帖子,我错了,我n年前太菜了,让大家见笑了



问题的集锦好象很容易吸引人,因为总会有个问题你会懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP