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);
网络编程之delphi
}
五、关于1500
这个1500字节,发送的时候,协议要进⾏包装,加上协议信息,也叫协议头,或者叫包头,这个头不同协议不同⽹络层长度不同,我们的实际数据不能写满1500,要留出⼀部分给协议加上协议信息,数据才能正确发送到想发送的⽬的地。
所以⼀般我们填1400或者1024字节都可以,⾃⼰要发送的数据加上包头⼩于1500就⾏。
如果超过了就会被系统分成两个数据包发送,分⽚处理。如果这样的话要打包发送,接受⽅还要拆包处理,降低了效率。
有的协议分包后⼆包直接丢了

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。