提醒初学者注意 send(sendto) recv(recvfrom) 中的 参数flags

类别:VC语言 点击:0 评论:0 推荐:

/*

说明:

    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 。
工作的很好了。

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

本文地址:http://com.8s8s.com/it/it2002.htm