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

原创 2003年02月18日 08:50:00

/*

说明:

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

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

send和recv的flags

send和recv解释 int send(int s, const void *msg, size_t len, int flags); flags取值有: 0: 与write()无异 ...
  • yuanfengyun
  • yuanfengyun
  • 2016年01月09日 12:04
  • 3840

Socket层实现系列 — send()类发送函数的实现

主要内容:socket发送函数的系统调用、Socket层实现。 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 以下是send()、sendto()、...
  • zhangskd
  • zhangskd
  • 2015年09月06日 22:23
  • 10389

sendto函数深入理解

send和sendto函数在UDP层没有输出缓冲区,在TCP层有输出缓冲区,recv和recvfrom无论在UDP层还是TCP层都有接收缓冲区。 注意在server和client端绑定IP时没有注明s...
  • xiaoshengqdlg
  • xiaoshengqdlg
  • 2014年07月28日 20:19
  • 5158

send,recv,sendto,recvfrom

send函数 int send( SOCKET s,    const char FAR *buf,    int len,    int flags );  不论是客户还是服务器应用程序都用send...
  • liangkaiyang
  • liangkaiyang
  • 2010年10月10日 19:39
  • 29384

send和sendto的区别

ttp://www.beej.us/guide/bgnet/output/html/multipage/sendman.html send()用于TCP SOCK_STREAM,sendto...
  • jollyjumper
  • jollyjumper
  • 2014年12月06日 09:20
  • 7708

Spring-messaging (STOMP) @SendTo 与 @SendToUser的区别

@SendTo 与 @SendToUser 是Spring的STOMP协议中注解的标签。 @SendTo 会将接收到的消息发送到指定的路由目的地,所有订阅该消息的用户都能收到,属于广播。 @Sen...
  • fly_leopard
  • fly_leopard
  • 2017年11月29日 13:57
  • 704

send、sendto与sys_sendto之间的关系

sys_sendto() sys_socketcall() --> sys_sendto() asmlinkage long sys_sendto(            int        ...
  • lmjjw
  • lmjjw
  • 2013年10月09日 21:46
  • 2496

sendto 可以发送 TCP数据报吗?

1、sendto函数,相信网上一查就一堆的资料。sendto似乎是为UDP而生的。因为这个sendto函数的参数,就要求了这个连接不需要提前建立。sendto函数不关心数据发送者的协议地址,只要知道了...
  • cogbee
  • cogbee
  • 2013年09月07日 22:33
  • 4325

socket编程:从send函数和sendto函数参数的不同看TCP和UDP的差别。

ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t sendto(int sockfd, cons...
  • iw1210
  • iw1210
  • 2013年01月19日 16:09
  • 13202

send sendto ,recv recvfrom有什么区别

一般情况下: send(),recv()用于TCP,sendto()及recvfrom()用于UDP 但是send(),recv()也可以用于UDP,sendto()及recvfrom()也可以用...
  • XVD217
  • XVD217
  • 2014年08月28日 18:59
  • 3733
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:提醒初学者注意 send(sendto) recv(recvfrom) 中的 参数flags
举报原因:
原因补充:

(最多只允许输入30个字)