斜树的空间

集中精力,放弃一切的去做一件事情,只要尽力了,即使失败了,你也不会后悔!

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  47 随笔 :: 0 文章 :: 12 评论 :: 0 Trackbacks

#

使用协议UDP,仅实现简单的连接功能:

服务端:
#pragma   comment(lib,   "ws2_32.lib ")

#include <winsock2.h>
#include <stdio.h>

int main()
{
 SOCKET socket1;
 WSADATA wsaData;


 int iErrorcode;
 if(WSAStartup(MAKEWORD(2,2), &wsaData))
 {
  printf("Winsock can not be init!");
  WSACleanup();
  return 0;
 }

 printf("server begin to create socket!\n");
 //struct sockaddr_in local;
 //struct sockaddr_in from;
 sockaddr_in local;
 sockaddr_in from;

 int fromlen = sizeof(from);

 local.sin_addr.s_addr = INADDR_ANY;
 local.sin_family =  AF_INET;
 local.sin_port = htons(5566);

 socket1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 bind(socket1, (struct sockaddr *)&local, fromlen);
 
 while(1)
 {
  char buffer[1024] = "\0";

  printf("waiting message form client:");

  if(SOCKET_ERROR != recvfrom(socket1,
   buffer, sizeof(buffer), 0,
   (struct sockaddr *)&from, &fromlen))
  {
   if(strcmp(buffer, "bye") == 0)
   {
    printf("client quit!\n");
    break;
   }
   printf("recieve message form %s -- %s \n",
    inet_ntoa(from.sin_addr), buffer);
   sendto(socket1, buffer, sizeof(buffer),
    0, (struct sockaddr *)&from, fromlen);
  }
  
 }
 closesocket(socket1);

 return 0;
}

客户端:
#pragma   comment(lib,   "ws2_32.lib ")

#include <winsock2.h>
#include <stdio.h>

int main()
{
 SOCKET socket1;
 WSADATA wsaData;

 if(WSAStartup(MAKEWORD(2,2), &wsaData))
 {
  printf("can not init !\n");
  WSACleanup();
  return 0;
 }
 
 printf("client begin to create socket!\n");
 struct sockaddr_in server;
 int len = sizeof(server);

 server.sin_addr.s_addr = inet_addr("127.0.0.1");
 server.sin_port = htons(5566);
 server.sin_family = AF_INET;

 socket1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP );
 
 while(1)
 {
  char buffer[1024] = "\0";
  printf("input message: ");
  scanf("%s", buffer);
  if(strcmp(buffer, "bye") == 0)
  {
   sendto(socket1, "bye", 3 * sizeof(char), 0,
    (struct sockaddr *)&server, len);
   printf("exit!\n");
   Sleep(100);
   closesocket(socket1);
   break;
  }
  
  if(SOCKET_ERROR != sendto(socket1, buffer, sizeof(buffer),
   0, (sockaddr *)&server, len))
  {
   Sleep(100);
   if(recvfrom(socket1, buffer, sizeof(buffer), 0, (struct sockaddr *)&server, &len) != SOCKET_ERROR)
   {
    printf("recieve from server : %s \n", buffer);
   }
  }
  
 }
 closesocket(socket1);

 return 0;
}

posted @ 2010-05-15 21:12 张贵川 阅读(666) | 评论 (0)编辑 收藏

今早配置MYSQL,在WIN7中配置了一个早上,老是报1045的错误,说是MYSQL在WINDOWS中一直存在的错误,查了N多资料也不行,又不想重装。
看到一个解释是这样的:

该错误只在Windows系统上出现,Linux下好像好没有,据说这个错误已经存在n年了,有人extremely dispointedin  that it still exists here 2009!

错误的原因更令人抓狂,那就是mysql server instance config wizard根本没有为你设密码,于是root密码是空!实在不明白如果没有为我设密码那中间为什么叫我设个密码。


但他的方法我试了也没用。
问题还真的是千奇百怪。
最后没办法点开instance config wizard 从头来一遍,先把原来的配置卸载了,然后重新配置。最后竟然不报1045的错误了。网上很多都说要重装才能解决问题,我看这方法和重装没啥区别,但比重装省时间。
真的是晕,看来要深入了解MYSQL的结构才能解释为什么了,初玩姑且就算一种解决1045方法吧!

posted @ 2010-05-08 10:56 张贵川 阅读(105) | 评论 (0)编辑 收藏

在  项目------添加类-----mfc------active x控件的MFC类----
后面自己就知道怎么做了

posted @ 2010-05-04 19:06 张贵川 阅读(1316) | 评论 (0)编辑 收藏

   全局变量的定义:
在MFC的框架中有个全局变量:
CTestApp theApp;
theApp是在进入WinMain函数之前就构造好值的。
所以可以进入WinMain函数之前是先执行theApp的构造函数。
孙鑫老师说MFC是通过应用程序类的对象来标识应用程序的实例的(这句话不明白,应该都是hInstance标识的吧,也许要等到我看侯捷老师书的时候才知道了),且每个MFC程序有且仅有一个从CWinApp派生的类。也仅有一个CWinApp派生类的对象,即仅有一个theApp对象。theApp对象就标识了应用程序本身。
即theApp是统领其它类的。
并且CWinApp类是派生于CWinThread类的,
There are two general types of threads that CWinThread supports: worker threads and user-interface threads. Worker threads have no message pump: for example, a thread that performs background calculations in a spreadsheet application. User-interface threads have a message pump and process messages received from the system. CWinApp and classes derived from it are examples of user-interface threads. Other user-interface threads can also be derived directly from CWinThread.

MSDN中还提供了一些额外的操作全局信息的函数:

  • AfxGetApp   Obtains a pointer to the CWinApp object.

  • AfxGetInstanceHandle   Obtains a handle to the current application instance.

  • AfxGetResourceHandle   Obtains a handle to the application's resources.

  • AfxGetAppName   Obtains a pointer to a string containing the application's name. Alternately, if you have a pointer to the CWinApp object, use m_pszExeName to get the application's name.

    看看MFC中的 main()函数:
    extern "C" int WINAPI
    _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
     _In_ LPTSTR lpCmdLine, int nCmdShow)
    #pragma warning(suppress: 4985)
    {
     // call shared/exported WinMain
     return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
    }

  • posted @ 2010-05-01 20:59 张贵川 阅读(409) | 评论 (1)编辑 收藏

    晚上搞了半天才发现:原来类模板不能分文件写!
    如:
    template <class Type>
    class TNumber
    {
    public:
     ~TNumber()
     {
     }

     void SetItem(Type);
     Type GetItem();
    private:
     Type m_item;
    };

    写到casual.h中f。而实现文件写入casual.cpp中,那么在main文件中调用时就会提示外部命令无法解析的错误。
    如:
    1>main.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall TNumber<int>::GetItem(void)" (?GetItem@?$TNumber@H@@QAEHXZ),该符号在函数 _main 中被引用

    看到一个解释是:
    因为模板类在编译的时候就相当于宏定义,分两个文件是找不到的。

    解决办法可以:
    1.类模板定义和实现在同一文件。
    2.在main文件中连续包含定义文件和实现文件.
    #include "casual.h"
    #include "casual.cpp"

    int main()
    {

     TNumber<int> obj1;

     cout << obj1.GetItem() << endl;

       return 0;
    }

    posted @ 2010-04-22 01:01 张贵川 阅读(2716) | 评论 (7)编辑 收藏

    先解释const 的记忆问题:
    比如: 
    type  const * p;  
     * p 是表示对象, const 修饰 *p ,  就表示常对象。即 *p  对象不可改变。 所以  p  不是 常指针,是指向常量的指针。
    相对于:const type * const * p; 的写法,个人推荐前一种。

    而:
    type  * const p;
    const 修饰 p, 所以 p  是常量,而* const p 即代表指针常量.   p 是常指针。


    所以
     int * & func(C &oC)
     {
      return oC.m_p;
     }
    表示返回指针的引用

    但没有:
     int & * func(C &oC)
     {
      return oC.m_p;
     }

    编译器会把 int & *  中的 & 看作取地址符号。
    如果要对  int  型变量进行应用,为没必要这样
    可以这样写:
     int  & func(C &oC)
     {
      return  *oC.m_p;
     }

    同样记忆:
    常引用对象: type const & Ref ;
    还要注意const 修饰函数只能是  类成员函数,而不能是全局函数

    posted @ 2010-04-16 20:49 张贵川 阅读(240) | 评论 (0)编辑 收藏

    class CBase
    {
    public:
     CBase(int iNum) : m_iNumber(iNum)
     {

     }
     CBase(CBase & oBase)
     {
      
     }
    protected:
     int m_iNumber;
    };
    class B : public CBase
    {
    public:
     B(int iNum, int iNum2) : CBase(iNum), m_iNumber2(iNum2)
     {
     }
     
     B(B & oB) : CBase(oB.m_iNumber)
     {
      m_iNumber2 = oB.m_iNumber2;
     }

     void show()
     {
      cout << m_iNumber <<  "  " << m_iNumber2 << endl;
     }

    private:
     int m_iNumber2;
    };

    如果没有 B中的 拷贝构造函数   B(B & oB) : CBase(oB.m_iNumber) 后面的初始化CBase(oB.m_iNumber)则会报这样的错误:
     error C2512: “CBase”: 没有合适的默认构造函数可用

    当然以下这样初始化更符合 都是  拷贝构造函数的逻辑:
    B(B & oB) : CBase(&oB) 


    posted @ 2010-04-16 20:08 张贵川 阅读(1363) | 评论 (0)编辑 收藏

    仅列出标题
    共5页: 1 2 3 4 5