其他代码省略, 一个使用Socket客户端从网上Socket服务器得到时间 更新到本地程序的代码:
...........
 unsigned long         ulTime ;
.................
recv (sock, (char *) &ulTime, 4, MSG_PEEK) ;
...............................里面的 (char *) &ulTime 是什么意思?  ulTime是一个long型的数据,这里他先取得这个long型数据的地址,然后强行转换成一个指针???recv的第二个参数定义为:"指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据". 不理解这里的用法,问的比较初级,请讲的细一点,谢谢!

解决方案 »

  1.   

    第二个参数是告诉recv把收到的数据存放到指定的内存空间,recv要求的内存空间参数是 char * 类型的,也就是字节指针.这个例子里面 ulTime 是 unsigned long 类型的,所以要进行这样的转换:1.需要取 ulTime 的地址 2.类型为 char * .所以需要强制类型转换 (char *)&ulTime
      

  2.   

    第二个参数就是如lz所说:指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据一个ulTime变量也是一个4字节的缓冲区啊。
      

  3.   

    那这个 unsigned long         ulTime ; 呢?
    我以前用 Java,直接声明用long ulTime;
    就行了,为什么在windows C中,一定要用这个 unsigned 呢,都什么情况下必须用unsigned 这种无符号型(是不是变量有正负的时候)? 是不是只要我不使用位运算,就没必要用unsigned ?
      

  4.   

    还有,我是一个单窗口程序,我创建Socket服务器端的话,我启动这个服务器端的代码是写在WinMain的CreateWindow前面,还是写在WndProc的CASE WM_CREATE事件里面?
      

  5.   

    谁告诉你“必须”了?你声明long一样可以
    觉得楼主对C++得基本概念很不熟悉,不能靠java那点知识来理解C++,虽然他们很象。如果你真想搞C++,至少买本C++ Prime钻研几个星期再说,不要因为看到和java类似得语法就跳过几个章节,这是非初学者常遇到得问题,总以为自己懂了,一些自以为无关紧要得章节就跳过不学了。楼主所说得什么时候用unsigned得问题,这哪有定规?你至少需要理解unsigned是干吗的,是否定义unsigned到底有什么不同(仅仅知道它有正负是不够的,还要知道有没有正负到底会导致那些结果的不同),这点我相信你在java里也没有学透
      

  6.   

    楼主在java里声明long ulTime,知道ul是干吗的么?声明long变量为什么要用ul前缀?
      

  7.   

    我如果把代码写在 WM_CREATE里面,如果接收到消息怎样显示在屏幕上?
     case WM_CREATE:
    iRetval     =   WSAStartup(wVersion,&wsaData);   
    wVersion   =   MAKEWORD(1,1);   
    sockLisnId=socket(AF_INET,SOCK_STREAM,0);
    socketaddr.sin_port=htons(9999);
    socketaddr.sin_family=AF_INET;
    socketaddr.sin_addr.s_addr= htonl(INADDR_ANY);   
    iResBind=bind(sockLisnId,(LPSOCKADDR)&socketaddr,sizeof(socketaddr));
    iLisnRes=listen(sockLisnId,SOMAXCONN);
    while(TRUE){
    sockAccpt=accept(sockLisnId,(struct sockaddr*)&socketaddr,sizeof(socketaddr));
    iRevRes=recv(sockAccpt,szBuffer,1024,0);
    closesocket(sockAccpt);
    }
    closesocket(sockLisnId);
    WSACleanup();好像在 WM_CREATE里面没办法触发 WM_PAINT事件,难道必须调用 InvalidateRect这些函数吗
    不是写在哪里都可以的
      

  8.   

    我如果把代码写在 WM_CREATE里面,如果接收到消息怎样显示在屏幕上?
     case WM_CREATE:
    iRetval     =   WSAStartup(wVersion,&wsaData);   
    wVersion   =   MAKEWORD(1,1);   
    sockLisnId=socket(AF_INET,SOCK_STREAM,0);
    socketaddr.sin_port=htons(9999);
    socketaddr.sin_family=AF_INET;
    socketaddr.sin_addr.s_addr= htonl(INADDR_ANY);   
    iResBind=bind(sockLisnId,(LPSOCKADDR)&socketaddr,sizeof(socketaddr));
    iLisnRes=listen(sockLisnId,SOMAXCONN);
    while(TRUE){
    sockAccpt=accept(sockLisnId,(struct sockaddr*)&socketaddr,sizeof(socketaddr));
    iRevRes=recv(sockAccpt,szBuffer,1024,0);
    closesocket(sockAccpt);
    }
    closesocket(sockLisnId);
    WSACleanup();好像在 WM_CREATE里面没办法触发 WM_PAINT事件,难道必须调用 InvalidateRect这些函数吗
    不是写在哪里都可以的