工作中的一些小总结

来源:互联网 发布:植物大战僵尸 知乎 编辑:程序博客网 时间:2024/05/05 10:08

2010-10-20 一语点醒梦中人

    前几天在调试基于UDP协议传输数据的代码,卡了两天,死活不通。原意是使用UDP协议读取到特定的字节后改变缓冲区大小,再使用它去读取后边的数据,但是再读取数据时,读到的数据是这个特定的字节加后边的信息,不知道为什么会重复读取到这个特定的字节。后来一个同事问另一个同事,他说:使用UDP协议传输数据,每次的数据都是新的,这次传输的数据没读完,UDP包就被丢弃了,下次读取的数据就是另外一个新的UDP包了。后来在代码中加上打印信息,两次读的数据果然不同。真是一语点醒梦中人,在此记下,以免以后碰到类似问题又忘了!

2010-10-26 字节对齐

    下午看程序源码的时候看见这么个东西:“struct xxx{...;}__attribute__((packed));”,Google了一下知道是字节对齐的扩展标志。类似的还有个“#pragma pack(n)”,VC++6.0只支持后者,GCC二者都支持。想起来以前到公司笔试的时候遇到过“#pragma pack(n)”,当时不知道什么意思,在几个题后边全写一样的结果...二者都可以用于调整结构体或者联合体中的字节对齐。
    对于前者,括号里为“(packed)”的时候,如果是普通数据类型,那么表示按照1个字节对齐,如果是位域时,表示按位对齐;如果括号中是“(aligned(n))”,表示按照n个字节对齐(n必须是2的幂),但是经测试n的值小于结构体或者联合体中最长的变量的长度时,对齐采用默认对齐方式;当编译器对变量的最大对齐值设置为一个特定值时,如果n大于这个值,那么只按照编译器设置的最大值对齐。如果括号中是“(aligned)”,采用默认的对齐方式。另外,__attribute__(xxx)可以用于结构体或联合体中的成员。
    对于后者,括号里为空时,表示采用默认最大最有益的对齐方式。n也必须是2的幂。当n小于结构体或者联合体中最长的变量的长度时,对齐采用n字节对齐方式;当n大于等于结构体或者联合体中最长的变量的长度时,采用默认对齐方式。#pragma pack(x)不能单独用于结构体和联合体中的成员。

    默认对齐方式是采用当前最长的变量的长度作为对齐方式。

2011-10-20

setsockopt函数在Windows和Linux下设置参数的区别

Linux:

    struct timeval tv = {3, 0};//3s

    int ret = setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));

    int ret = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));

    //ret == 0 OK, ret == -1 fail

    int recvd = recv(sock_fd, buf, 1024, 0);

    if (recvd == -1 && errno == EAGAIN)

   {

              printf("timeout\n");

   }

Windows:

   int timeout = 3000; //3s

   int ret = setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));

   int ret = setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));