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); } }