最近在写一个网络诊断的小程序,由于粗心大意或说自己的初始化意识不够强,造成了被主管"鄙视"的事态,哈哈。笑完后,告诉自己,以后碰到使用数据结构的地方,就当是碰到指针一样,不管三七二十一,初始化先。
  在Debug下不初始化数据结构或句柄啥的没关系,因为Debug下,VC替你做了。但在Release下就会出现不确定的行为。有时可以,时不可以....
       比如在CListCtrl中改变图标的一段代码:
 1 void CPSDiagDlg::ChangeImage(int nItem,int nImg)
void CPSDiagDlg::ChangeImage(int nItem,int nImg)
 2

 {
{
 3 LVITEM item;
    LVITEM item;
 4 
    
 5 //memset(&item,0,sizeof(LVITEM));
    //memset(&item,0,sizeof(LVITEM));
 6 item.iItem = nItem;
    item.iItem = nItem;
 7 m_list.GetItem(&item);
    m_list.GetItem(&item);
 8 item.mask = LVIF_IMAGE;
    item.mask = LVIF_IMAGE;
 9 item.iImage = nImg;
    item.iImage = nImg;
10 m_list.SetItem(&item);
    m_list.SetItem(&item);
11 }
}   这段代码在Debug下运行得很好,但在Release却没什么影响,偶尔能改变图标(换图标)。如果把注释掉的5行放开,一切ok.
  还有一段发送UDP数据包的代码:
  创建sock:
 1 BOOL CPSSvrTester::CreateSocket(WORD wPort)
BOOL CPSSvrTester::CreateSocket(WORD wPort)
 2

 {
{    
 3 if (m_socket != INVALID_SOCKET && m_wPort != wPort)
    if (m_socket != INVALID_SOCKET && m_wPort != wPort)
 4
 
     {
{
 5 closesocket(m_socket);
        closesocket(m_socket);
 6 m_socket = INVALID_SOCKET;
        m_socket = INVALID_SOCKET;
 7 }
     }
 8 if(m_socket == INVALID_SOCKET)
    if(m_socket == INVALID_SOCKET)
 9
 
     {
{    
10 sockaddr_in    local;
        sockaddr_in    local;    
11 //wPort = 6002;
        //wPort = 6002;
12 if(wPort)
        if(wPort)
13 m_wPort = wPort;
            m_wPort = wPort;
14 
        
15 local.sin_family=AF_INET;
        local.sin_family=AF_INET;
16 local.sin_addr.s_addr=0;
        local.sin_addr.s_addr=0;
17 local.sin_port=htons(m_wPort);
        local.sin_port=htons(m_wPort);
18
19 WORD wTmpPort = wPort;
        WORD wTmpPort = wPort;
20 int iTimes = 0;
        int iTimes = 0;
21
22 m_socket = socket(AF_INET, SOCK_DGRAM, 0);
        m_socket = socket(AF_INET, SOCK_DGRAM, 0);        
23 while(bind(m_socket,(sockaddr *)&local,sizeof(sockaddr_in)) == SOCKET_ERROR)
        while(bind(m_socket,(sockaddr *)&local,sizeof(sockaddr_in)) == SOCKET_ERROR)
24
 
         {
{
25 closesocket(m_socket);
            closesocket(m_socket);
26 iTimes++;
            iTimes++;
27 if(iTimes>10)
            if(iTimes>10)
28 break;
                break;
29 //m_socket = INVALID_SOCKET;
            //m_socket = INVALID_SOCKET;
30 if(wPort)
            if(wPort)
31 local.sin_port = htons(++wTmpPort);
                local.sin_port = htons(++wTmpPort);
32 m_socket = socket(AF_INET, SOCK_DGRAM, 0);
            m_socket = socket(AF_INET, SOCK_DGRAM, 0);
33 }
        }
34 if(iTimes<=10)
        if(iTimes<=10)
35
 
         {
{
36 int inamelen = sizeof(local);
            int inamelen = sizeof(local);
37 if(getsockname(m_socket,(SOCKADDR *)&local,&inamelen ) == SOCKET_ERROR)
            if(getsockname(m_socket,(SOCKADDR *)&local,&inamelen ) == SOCKET_ERROR)
38
 
             {
{
39 closesocket(m_socket);
                closesocket(m_socket);
40 m_socket = INVALID_SOCKET;
                m_socket = INVALID_SOCKET;
41 return FALSE;
                return FALSE;
42 }
            }
43 m_wPort = ntohs(local.sin_port);
            m_wPort = ntohs(local.sin_port);
44 }
        }
45 else
        else
46
 
         {
{
47 closesocket(m_socket);
            closesocket(m_socket);
48 m_socket = INVALID_SOCKET;
            m_socket = INVALID_SOCKET;
49 return FALSE;
            return FALSE;
50 }
        }
51 int TimeOut=2000;
        int TimeOut=2000;
52 setsockopt (m_socket, SOL_SOCKET,SO_RCVTIMEO,(CHAR *) &TimeOut,sizeof (TimeOut));
        setsockopt (m_socket, SOL_SOCKET,SO_RCVTIMEO,(CHAR *) &TimeOut,sizeof (TimeOut));
53 return TRUE;
        return TRUE;
54 }
    }
55 return TRUE;
    return TRUE;
56 }
} 发送UDP数据包的代码:
 1 BOOL CPSSvrTester::Send(BYTE *pData, DWORD dwDataLen, DWORD dwSendTo, WORD wPort)
BOOL CPSSvrTester::Send(BYTE *pData, DWORD dwDataLen, DWORD dwSendTo, WORD wPort)
 2

 {
{
 3 if (m_socket == INVALID_SOCKET)
    if (m_socket == INVALID_SOCKET)
 4
 
     {
{
 5 return FALSE;
        return FALSE;
 6 }
    }
 7 SOCKADDR_IN        remote;
    SOCKADDR_IN        remote;    
 8 int                iRet;
    int                iRet;            
 9 remote.sin_family = AF_INET;
    remote.sin_family = AF_INET;
10 remote.sin_port = htons(wPort);
    remote.sin_port = htons(wPort);
11 remote.sin_addr.s_addr = dwSendTo;
    remote.sin_addr.s_addr = dwSendTo;    
12 iRet = sendto(m_socket,(const char*)pData,dwDataLen,0,(SOCKADDR *)&remote,sizeof(remote));
    iRet = sendto(m_socket,(const char*)pData,dwDataLen,0,(SOCKADDR *)&remote,sizeof(remote));
13 if(iRet<=0)
    if(iRet<=0)
14 return FALSE;
        return FALSE;
15 return TRUE;
    return TRUE;
16 }
}   在Debug下先调用CreateSocket,然后调用Send发送数据,每次都ok.因为Debug,vc已把m_sock初始化为INVALID_SOCKET。而在Release下就完罗,怎么也发不了数据,因为CreateSocket里的代码根本没执行!
  在构造函数中添加:m_sock = INVALID_SOCKET;一切ok!
	
posted on 2006-09-03 00:19 
冰风谷 阅读(996) 
评论(0)  编辑 收藏 引用  所属分类: 
编程中的贝壳