Windows网络编程之send()函数

一、作用

向目标发送数据,本质上就是将数据复制粘贴进系统的协议发送缓冲区,计算机伺机发送出去

二、句法

int WSAAPI send(
  SOCKET     s,
  const char *buf,
  int        len,
  int        flags
);

s
标识已连接套接字的描述符。

buf
指向包含要传输的数据的缓冲区的指针。

len
buf参数指向的缓冲区中数据的长度(以字节为单位)。

flags
一组标志,指定进行呼叫的方式。通过将按位或运算符与以下任何值一起使用来构造此参数。

  • MSG_DONTROUTE:指定不应对数据进行路由。Windows套接字服务提供者可以选择忽略此标志。
  • MSG_OOB:发送OOB数据(仅SOCK_STREAM之类的流式套接字。
示例
send(socketClient, "abcd", sizeof("abcd"), 0)

三、参数

参数1

目标的socket,每个客户端对应唯一的socket

参数2

给对方发送的字节串
这个一般不超过1500个字节,也是网络传输的最大单元,也就是客户端发过来的数据,是协议规定的,这个数据也是根据很多情况总结出来的最优值
1500的相关知识文末进一步说明

参数3

要发送的字节个数,决定发送的个数,如果比参数2中的要发送的字节数短,则只发送参数3决定的个数,后面的就不管了,大了就发送过多的字节,内存可能泄漏
一般与参数2一样大小

参数4

一般直接写0就行

其他:

  1. MSG_OOB:传输一段数据,再外带一个额外的特殊数据,但不建议使用,一般忽略就行
  2. MSG_DONTROUTE :指定数据不应受路由限制,windows套接字服务提供。程序可以选择忽略

四、返回值

  • 成功返回写入的字节数
  • 失败返回SOCKET_ERROR:通过函数得到相应的错误码,做出相应处理
if (SOCKET_ERROR == send(socketClient, "abcd", sizeof("abcd"), 0)) {
		//如果出错
		printf("send()函数出错,错误码:%d\n", WSAGetLastError);
	}

五、关于1500

  • 这个1500字节,发送的时候,协议要进行包装,加上协议信息,也叫协议头,或者叫包头,这个头不同协议不同网络层长度不同,我们的实际数据不能写满1500,要留出一部分给协议加上协议信息,数据才能正确发送到想发送的目的地。
  • 所以一般我们填1400或者1024字节都可以,自己要发送的数据加上包头小于1500就行。
  • 如果超过了就会被系统分成两个数据包发送,分片处理。如果这样的话要打包发送,接受方还要拆包处理,降低了效率。
  • 有的协议分包后二包直接丢了

你可能感兴趣的:(网络编程)