本文主要介绍send()函数和sendto()函数在C语言中的使用,这是C语言入门学习中的基础知识。有需要的朋友可以参考一下。
C send()函数:通过套接字传输数据
头文件:
#包含sys/types . h #包含sys/socket.h
定义功能:
int send(int s,const void * msg,int len,unsigned int falgs);
函数描述:send()用于将数据从指定的套接字发送到另一台主机。参数s是已建立连接的套接字。参数msg指向要连接的数据内容,参数len是数据长度。参数flags一般设置为0,其他值定义如下:
MSG_OOB发送的数据是带外发送的
MSG_DONTROUTE取消路由表查询
MSG_DONTWAIT设置为非阻塞操作。
MSG_NOSIGNAL这个动作不愿意被SIGPIPE信号中断。
返回值:如果成功,返回实际传输的字符数;如果失败,将返回-1。错误原因存储在errno中。
错误代码:
EBADF参数s是非法的套接字处理代码。
EFAULT参数中有一个指向不可访问的内存空间的指针。
ENOTSOCK参数s是文件描述符,不是套接字。
EINTR被信号中断。
EAGAIN,这个操作会阻塞进程,但是参数s的套接字是无法破解的。
ENOBUFS系统缓冲内存不足。
ENOMEM核心内存不足。
EINVAL传递给系统调用的参数不正确。
C sendto()函数:通过套接字传输数据
头文件:
#包含sys/types . h #包含sys/socket.h
定义:int send to (int s,constvoid * msg,int len,unsigned int flags,conststruct sockaddr * to,int tolen);
函数描述:sendto()用于将数据从指定的套接字传输到另一台主机。参数s是已经建立连接的socket,如果使用UDP协议,则不需要连接操作。参数msg指向要连接的数据内容,参数flags一般设置为0。详细描述请参考send()。参数to用来指定要传输的网络地址,sockaddr引用的结构是bind()。参数tolen是sockaddr的结果长度。
返回值:如果成功,返回实际传输的字符数;如果失败,将返回-1;错误原因将存储在errno中。
错误代码:
1.EBADF参数s的非法套接字处理代码.
2.EFAULT参数中有一个指针指向不可访问的内存空间。
3.WNOTSOCK canshu s是文件描述符,不是socket。
4.EINTR被信号中断。
5.EAGAIN这个动作会阻塞进程,但是参数S的soket被make-up类阻塞。
6.ENOBUFS系统的缓冲内存不足。
7.EINVAL传递给系统调用的参数不正确。
模型
#包含sys/types.h
#包含sys/socket.h
#包含netinet.in.h
#包含arpa.inet.h
#定义端口2345 /*使用的端口*/
主()
{
int sockfd,len
struct sockaddr _ in addr
char缓冲器[256];
//创建套接字
if(sockfd=socket(AF_INET,SOCK_DGRAM,0)) 0)
{
perror(‘插座’);
出口(1);
}
//填写sockaddr_in结构
bzero(addr,sizeof(addr));
addr.sin _ family=AF _ INET
addr . sin _ PORT=htons(PORT);
addr . sin _ addr=hton 1(in addr _ ANY);
if(bind(sockfd,addr,sizeof(addr)) 0)
{
perror('连接');
出口(1);
}
while(1)
{
bezro(buffer,sizeof(buffer));
len=recvfrom(socket,buffer,sizeof(buffer),0,addr addr _ len);
//显示客户端的网络地址
printf('接收自%s\n ',inet _ ntoa(addr . sin _ addr));
//将字符串返回给客户端
sendto(sockfd,buffer,len,0,addr,addr _ len);
}
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。