c语言udpsend函数 c语言 udp

C语言 send()函数理解

使用函数getsockopt获得发送缓冲区的长度。用法如下:

站在用户的角度思考问题,与客户深入沟通,找到康巴什网站设计与康巴什网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站设计制作、网站建设、企业官网、英文网站、手机端网站、网站推广、域名注册网站空间、企业邮箱。业务覆盖康巴什地区。

int sockfd;

int val;

int len;

sockfd = socket (AF_INET, SOCK_STREAM, 0);

len = sizeof (val);

getsockopt( sockfd, SOL_SOCKET, SO_SNDBUF, val, len);

printf ("sndbuf len=%d\n", val);

在32位linux系统上发送缓冲区为16K ,可以使用setsockopt()修改,会影响网络性能

在C语言中send buff的用法?

C语言中的标准库中是没有Send函数的。

从名称来看应该是自定义的函数。具体实现的功能、参数及调用的要求,需要在阅读函数之后才能得到结论。

当然如果是C++的话,在Tcp中是具备Send函数的。具体见下:

send()用于向一个已经连接的socket发送数据,如果无错误,返回值为所发送数据的总数,否则返回SOCKET_ERROR。

简述

向一个已连接的 套接口发送数据。

#include winsock.h

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

s:一个用于标识已连接套接口的描述字。

buf:包含待发送数据的 缓冲区。

len:缓冲区中数据的长度。

flags:调用执行方式。

注释

send()适用于已连接的数据包或流式 套接口发送数据。对于数据报类套接口,必需注意发送数据长度不应超过 通讯子网的IP包最大长度。IP包最大长度在 WSAStartup()调用返回的WSAData的iMaxUdpDg元素中。如果数据太长无法自动通过下层协议,则返回WSAEMSGSIZE错误,数据不会被发送。

请注意成功地完成send()调用并不意味着 数据传送到达。

如果传送系统的 缓冲区空间不够保存需传送的数据,除非套接口处于非阻塞I/O方式,否则send()将阻塞。对于非阻塞SOCK_STREAM类型的套接口,实际写的数据数目可能在1到所需大小之间,其值取决于本地和远端主机的 缓冲区大小。可用 select()调用来确定何时能够进一步发送数据。

在相关套接口的选项之上,还可通过标志位flag来影响函数的执行方式。也就是说,本函数的语义既取决于套接口的选项也取决于标志位。后者由以下一些值组成:

值意义

MSG_DONTROUTE 指明数据不选径。一个WINDOWS套接口供应商可以忽略此标志;MSG_OOB 发送带外数据(仅适用于SO_STREAM;)。

返回值

若无错误发生,send()返回所发送数据的总数(请注意这个数字可能小于len中所规定的大小)。否则的话,返回SOCKET_ERROR错误, 应用程序可通过WSAGetLastError()获取相应 错误代码。

错误代码:

WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。

WSAENETDOWN:WINDOWS 套接口实现检测到网络子系统失效。

WSAEACESS:要求地址为广播地址,但相关标志未能正确设置。

WSAEINTR:通过一个 WSACancelBlockingCall()来取消一个(阻塞的)调用。

WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。

WSAEFAULT:buf参数不在用户 地址空间中的有效位置。

WSAENETRESET:由于WINDOWS套接口实现放弃了连接,故该连接必需被复位。

WSAENOBUFS:WINDOWS套接口实现报告一个 缓冲区 死锁。

WSAENOTCONN:套接口未被连接。

WSAENOTSOCK:描述字不是一个套接口。

WSAEOPNOTSUPP:已设置了MSG_OOB,但套接口非SOCK_STREAM类型。

WSAESHUTDOWN:套接口已被关闭。一个套接口以1或2的how参数调用 shutdown()关闭后,无法再用send()函数。

WSAEWOULDBLOCK:

WSAEMSGSIZE:套接口为 SOCK_DGRAM类型,且数据报大于WINDOWS套接口实现所支持的最大值。

WSAEINVAL:套接口未用 bind()捆绑。

WSAECONNABORTED:由于超时或其他原因引起虚电路的中断。

WSAECONNRESET:虚电路被远端复位。

实现UDP协议传输的C语言程序。如被采纳,可追加悬赏,盼高手指教,不胜感激!!!

原型:

int WINAPI icePub_UdpSendAndReceive(char *sendBuffer,int bufferLen,char *strIP,int port,char *receiveBuffer,int timeoutSeconds,int retryCounts)

输入:sendBuffer 发送的数据

bufferLen sendBuffer的长度

strIP 服务端地址

port 端口

timeoutSeconds 超时时间,秒

retryCounts 接收失败重发次数

输出:receiveBuffer 接收的数据

返回码:接收数据的长度

char buff[1024],buff2[1024*10];

int receiveLen;

strcpy(buff,"tag:01\r\ncommand:reboot\r\ndata:none\r\n");

typedef int (WINAPI ICEPUB_UDPSENDANDRECEIVE)(char *sendBuffer,int bufferLen,char *strIP,int port,char *receiveBuffer,int timeoutSeconds,int retryCounts);

ICEPUB_UDPSENDANDRECEIVE *icePub_UdpSendAndReceive = 0;

HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");

if(hDLLDrv)

icePub_UdpSendAndReceive=(ICEPUB_UDPSENDANDRECEIVE *)GetProcAddress(hDLLDrv,"icePub_UdpSendAndReceive");

if(icePub_UdpSendAndReceive)

receiveLen=icePub_UdpSendAndReceive(buff,strlen(buff),"192.168.1.111",6000,buff2,15,1);

if(hDLLDrv)

FreeLibrary(hDLLDrv);

AfxMessageBox(buff2);


本文标题:c语言udpsend函数 c语言 udp
标题来源:http://cdiso.cn/article/dddgeip.html

其他资讯