中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > Network
提醒初学者注意send(sendto)recv(recvfrom)中的参数flags
作者:HongHuer 时间:2001-10-12 10:14 出处:互联网 责编:chinaitpower
              摘要:提醒初学者注意send(sendto)recv(recvfrom)中的参数flags

/*

说明:

    1 这篇文章是给象我一样的初学者看的,如果您有一些经验了,请不要看,因为它会花费您宝贵的时间。 

    2 使用 MSDN 版本:MSDN Library - October 2001

*/

第一次写这个玩意,感觉很新鲜。

也希望这件事(写文档)对我和大家有好处。

因为在开发的过程中出现一些弯路,后来发现了。想提醒大家注意。

刚开始接触 winsock 编程是2002-11-30,买的是《Visual C++ 6.0 网络编程实作教程》这本书(我个人认为这是一本很好的 winsock 编程的书,她很适合初学者),

刚开始使用 winsock 的时候, 是用CAsyncSocket这个类,在 Send and Recvive的时候,nFlags 都有默认的值 0 , 所以没有引起重视。

/*CAsyncSocket::Send

virtual int Send( const void* lpBuf, int nBufLen, int nFlags = 0 );

CAsyncSocket::Receive

virtual int Receive( void* lpBuf, int nBufLen, int nFlags = 0 );

*/

并且使用的还比较顺手,没有大的毛病出现。

到了后期,因为我自己想要尝试不同的东西,想要自己使用自己的CMySocket类,封装winsock  api,(一直以来我也喜欢自己封装比较底层的东西,感觉好一些)。

问题来了,在封装的过程中,我查看MSDN

/*

int send (
  SOCKET s,             
  const char FAR * buf, 
  int len,              
  int flags             
);
 
The flags parameter can be used to influence the behavior of the function beyond the options specified for the associated socket. The semantics of this function are determined by the socket options and the flags parameter. The latter is constructed by or-ing the following values:

Value Meaning
MSG_DONTROUTE Specifies that the data should not be subject to routing. A
               Windows Sockets service provider can choose to ignore this
               flag.

MSG_OOB Send out-of-band data (stream-style socket such as SOCK_STREAM
        only. Also see DECnet Out-Of-band data for a discussion of this
        topic).

*/

/*我个人是这样翻译的:

flags 参数可以影响和(本地 socket)相关联的远端 socket 的行为,socket 选项和 flags 参数决定了这个函数(send函数)的功能。后者(flags 参数)可以是以下值的 或(|)。

值的意义
MSG_DONTROUTE 表明(所发送的)数据不应该通过 routing,windows socket service provider可以选择忽略这个标志

(《Windows网络编程技术》P141 里面是这样说的:MSG_DONTROUTE标志要求传送层不要将它发出的包路由出去,由基层的传送决定是否实现这一请求)


MSG_OOB 发送 OOB data(比如 流形式的 socket,仅有SOCK_STREAM适用 ,也可以参看DECnet 关于Out-Of-band data这个主题的讨论)

*/

在send时,我选了MSG_DONTROUTE标志,因为我没有带外数据啊,(我以为只能有这么两个值可以填进去啊!)

在recv时,我选了MSG_PEEK。

结果我在recv的时候得不到正确的结果,还不知道为什么错。

查了一个上午,哈哈,终于知道是标志的设置问题。

我现在把他们设置为 0 。
工作的很好了。

你们也有遇到这样的问题吗?
给象我一样的初学者提个醒。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有