houtinghua 发表于 2007-12-21 16:39

又是我 小问题集锦 纯新手 相当简单

纯菜鸟问题

u8 buf
struct linger linger = { 0 };
      linger.l_onoff = 0;
      linger.l_linger = 0;
      status = setsockopt(listenfd,SOL_SOCKET, SO_LINGER,(const char *) &linger,sizeof(linger));
if (-1 == status)
                {
                            perror("setsockopt(...,SO_LINGER,...)");
                }
       
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family      = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port      = htons(AUTH_PORT);

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

        listen(listenfd, 5);


        for ( ; ; ) {
                int connfd;
                clilen = sizeof(cliaddr);
                        printf("87 ok!                listenfd is %d        \n",listenfd);
                connfd = accept(listenfd, (SA *) &cliaddr, &clilen);
        //slaveSocket = accept(serverSocket,(struct sockaddr *) &clientName, &clientLength);
buf_len = 0;
        while(0<(rc=read(connfd, &buf, NET_FRAME_LENGTH)))//NET_FRAME_LENGTH = 14
      {
              buf_len += rc;
                if (NET_FRAME_LENGTH == buf_len)
                {
                        break;
                }
      }

        if (buf_len < NET_FRAME_LENGTH)
        {
                close(connfd);
                continue;
        }

        write(connfd, buf, NET_FRAME_LENGTH);
        close(connfd);
        }




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

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

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

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

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

scutan 发表于 2007-12-21 18:00

1. (const char*)&linger 是说取linger这个结构体的地址, 由于现在这个地址是(struct linger*)类型, 而(const char*)就是将这个类型转换成(const char*)类型. 而其值是不变的. 只是类型变了. 而类型变了会造成什么样的影响你可以参考<C专家编程> 这本书.

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

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

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

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

alaulong 发表于 2007-12-21 18:56

精辟。。。:lol: :lol:

houtinghua 发表于 2012-11-27 15:37

我现在集中回复我以前发的SB帖子,我错了,我n年前太菜了,让大家见笑了



问题的集锦好象很容易吸引人,因为总会有个问题你会懂
页: [1]
查看完整版本: 又是我 小问题集锦 纯新手 相当简单