C语言中send()函数和sendto()函数的使用方法
C语言send()函数:经socket传送数据
头文件:
#include<sys/types.h>#include<sys/socket.h>
定义函数:
intsend(ints,constvoid*msg,intlen,unsignedintfalgs);
函数说明:send()用来将数据由指定的socket传给对方主机.参数s为已建立好连接的socket.参数msg指向欲连线的数据内容,参数len则为数据长度.参数flags一般设0,其他数值定义如下:
MSG_OOB传送的数据以out-of-band送出.
MSG_DONTROUTE取消路由表查询
MSG_DONTWAIT设置为不可阻断运作
MSG_NOSIGNAL此动作不愿被SIGPIPE信号中断.
返回值:成功则返回实际传送出去的字符数,失败返回-1.错误原因存于errno
错误代码:
EBADF参数s非合法的socket处理代码.
EFAULT参数中有一指针指向无法存取的内存空间
ENOTSOCK参数s为一文件描述词,非socket.
EINTR被信号所中断.
EAGAIN此操作会令进程阻断,但参数s的socket为不可阻断.
ENOBUFS系统的缓冲内存不足
ENOMEM核心内存不足
EINVAL传给系统调用的参数不正确.
C语言sendto()函数:经socket传送数据
头文件:
#include<sys/types.h>#include<sys/socket.h>
定义函数:intsendto(ints,constvoid*msg,intlen,unsignedintflags,conststructsockaddr*to,inttolen);
函数说明:sendto()用来将数据由指定的socket传给对方主机.参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作.参数msg指向欲连线的数据内容,参数flags一般设0,详细描述请参考send().参数to用来指定欲传送的网络地址,结构sockaddr请参考bind().参数tolen为sockaddr的结果长度.
返回值:成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno中.
错误代码:
1、EBADF参数s非法的socket处理代码.
2、EFAULT参数中有一指针指向无法存取的内存空间.
3、WNOTSOCKcanshus为一文件描述词,非socket.
4、EINTR被信号所中断.
5、EAGAIN此动作会令进程阻断,但参数s的soket为补课阻断的.
6、ENOBUFS系统的缓冲内存不足.
7、EINVAL传给系统调用的参数不正确.
范例
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet.in.h>
#include<arpa.inet.h>
#definePORT2345/*使用的port*/
main()
{
intsockfd,len;
structsockaddr_inaddr;
charbuffer[256];
//建立socket
if(sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
{
perror("socket");
exit(1);
}
//填写sockaddr_in结构
bzero(&addr,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr=hton1(INADDR_ANY);
if(bind(sockfd,&addr,sizeof(addr))<0)
{
perror("connect");
exit(1);
}
while(1)
{
bezro(buffer,sizeof(buffer));
len=recvfrom(socket,buffer,sizeof(buffer),0,&addr&addr_len);
//显示client端的网络地址
printf("receivefrom%s\n",inet_ntoa(addr.sin_addr));
//将字串返回给client端
sendto(sockfd,buffer,len,0,&addr,addr_len);
}
}