📄 14.htm
字号:
<TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>成功则返回接收到的字符数,失败则返回-1,错误原因存于errno中。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>错误代码 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>EBADF 参数s非合法的socket处理代码<BR>EFAULT 参数中有一指针指向无法存取的内存空间。<BR>ENOTSOCK 参数s为一文件描述词,非socket。<BR>EINTR 被信号所中断。<BR>EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断。<BR>ENOBUFS 系统的缓冲内存不足<BR>ENOMEM 核心内存不足<BR>EINVAL 传给系统调用的参数不正确。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>/*利用socket的UDP client<BR>此程序会连线UDP server,并将键盘输入的字符串传给server。<BR>UDP server 范例请参考sendto()。<BR>*/<BR>#include<sys/stat.h><BR>#include<fcntl.h><BR>#include<unistd.h><BR>#include<sys/typs.h><BR>#include<sys/socket.h><BR>#include<netinet/in.h><BR>#include<arpa/inet.h><BR>#define PORT 2345<BR>#define SERVER_IP “127.0.0.1”<BR>main()<BR>{<BR>int s,len;<BR>struct sockaddr_in addr;<BR>int addr_len =sizeof(struct sockaddr_in);<BR>char buffer[256];<BR>/* 建立socket*/<BR>if((s = socket(AF_INET,SOCK_DGRAM,0))<0){<BR>perror(“socket”);<BR>exit(1);<BR>}<BR>/* 填写sockaddr_in*/<BR>bzero(&addr,sizeof(addr));<BR>addr.sin_family = AF_INET;<BR>addr.sin_port = htons(PORT);<BR>addr.sin_addr.s_addr = inet_addr(SERVER_IP);<BR>while(1){<BR>bzero(buffer,sizeof(buffer));<BR>/* 从标准输入设备取得字符串*/<BR>len =read(STDIN_FILENO,buffer,sizeof(buffer));<BR>/* 将字符串传送给server端*/<BR>sendto(s,buffer,len,0,&addr,addr_len);<BR>/* 接收server端返回的字符串*/<BR>len = recvfrom(s,buffer,sizeof(buffer),0,&addr,&addr_len);<BR>printf(“receive: %s”,buffer);<BR>}<BR>}<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>(先执行udp server 再执行udp client)<BR>hello /*从键盘输入字符串*/<BR>receive: hello /*server端返回来的字符串*/<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc279></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2><BR>recvmsg(经socket接收数据) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>recv,recvfrom,send,sendto,sendmsg,socket<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>#include<sys/types.h><BR>#include<sys/socktet.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>int recvmsg(int s,struct msghdr *msg,unsigned int flags);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>recvmsg()用来接收远程主机经指定的socket传来的数据。参数s为已建立好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据结构内容,参数flags一般设0,详细描述请参考send()。关于结构msghdr的定义请参考sendmsg()。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>成功则返回接收到的字符数,失败则返回-1,错误原因存于errno中。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>错误代码 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>EBADF 参数s非合法的socket处理代码。<BR>EFAULT 参数中有一指针指向无法存取的内存空间<BR>ENOTSOCK 参数s为一文件描述词,非socket。<BR>EINTR 被信号所中断。<BR>EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。<BR>ENOBUFS 系统的缓冲内存不足<BR>ENOMEM 核心内存不足<BR>EINVAL 传给系统调用的参数不正确。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>参考recvfrom()。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc280></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2><BR>send(经socket传送数据) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>sendto,sendmsg,recv,recvfrom,socket<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>#include<sys/types.h><BR>#include<sys/socket.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>int send(int s,const void * msg,int len,unsigned int falgs);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>send()用来将数据由指定的socket 传给对方主机。参数s为已建立好连接的socket。参数msg指向欲连线的数据内容,参数len则为数据长度。参数flags一般设0,其他数值定义如下<BR>MSG_OOB 传送的数据以out-of-band 送出。<BR>MSG_DONTROUTE 取消路由表查询<BR>MSG_DONTWAIT 设置为不可阻断运作<BR>MSG_NOSIGNAL 此动作不愿被SIGPIPE 信号中断。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>成功则返回实际传送出去的字符数,失败返回-1。错误原因存于errno<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>错误代码 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>EBADF 参数s 非合法的socket处理代码。<BR>EFAULT 参数中有一指针指向无法存取的内存空间<BR>ENOTSOCK 参数s为一文件描述词,非socket。<BR>EINTR 被信号所中断。<BR>EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。<BR>ENOBUFS 系统的缓冲内存不足<BR>ENOMEM 核心内存不足<BR>EINVAL 传给系统调用的参数不正确。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>参考connect()<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc281></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2><BR>sendmsg(经socket传送数据) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>send,sendto,recv,recvfrom,recvmsg,socket<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>#include<sys/types.h><BR>#include<sys/socket.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>int sendmsg(int s,const strcut msghdr *msg,unsigned int flags);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>sendmsg()用来将数据由指定的socket传给对方主机。参数s为已建立好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg 指向欲连线的数据结构内容,参数flags一般默认为0,详细描述请参考send()。<BR>结构msghdr定义如下<BR>struct msghdr<BR>{<BR>void *msg_name; /*Address to send to /receive from . */<BR>socklen_t msg_namelen; /* Length of addres data */<BR>strcut iovec * msg_iov; /* Vector of data to send/receive into */<BR>size_t msg_iovlen; /* Number of elements in the vector */<BR>void * msg_control; /* Ancillary dat */<BR>size_t msg_controllen; /* Ancillary data buffer length */<BR>int msg_flags; /* Flags on received message */<BR>};<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>错误代码 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>EBADF 参数s 非合法的socket处理代码。<BR>EFAULT 参数中有一指针指向无法存取的内存空间<BR>ENOTSOCK 参数s为一文件描述词,非socket。<BR>EINTR 被信号所中断。<BR>EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。<BR>ENOBUFS 系统的缓冲内存不足<BR>ENOMEM 核心内存不足<BR>EINVAL 传给系统调用的参数不正确。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>参考sendto()。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc282></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2><BR>sendto(经socket传送数据) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>send , sendmsg,recv , recvfrom , socket<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>#include < sys/types.h ><BR>#include < sys/socket.h ><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>int sendto ( int s , const void * msg, int len, unsigned int flags, const <BR>struct sockaddr * to , int tolen ) ;<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>sendto() 用来将数据由指定的socket传给对方主机。参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据内容,参数flags 一般设0,详细描述请参考send()。参数to用来指定欲传送的网络地址,结构sockaddr请参考bind()。参数tolen为sockaddr的结果长度。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno 中。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>错误代码 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>EBADF 参数s非法的socket处理代码。<BR>EFAULT 参数中有一指针指向无法存取的内存空间。<BR>WNOTSOCK canshu s为一文件描述词,非socket。<BR>EINTR 被信号所中断。<BR>EAGAIN 此动作会令进程阻断,但参数s的soket为补课阻断的。<BR>ENOBUFS 系统的缓冲内存不足。<BR>EINVAL 传给系统调用的参数不正确。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋体 size=2>#include < sys/types.h ><BR>#include < sys/socket.h ><BR># include <netinet.in.h><BR>#include <arpa.inet.h><BR>#define PORT 2345 /*使用的port*/<BR>main(){<BR>int sockfd,len;<BR>struct sockaddr_in addr;<BR>char buffer[256];<BR>/*建立socket*/<BR>if(sockfd=socket (AF_INET,SOCK_DGRAM,0))<0){<BR>perror (“socket”);<BR>exit(1);<BR>}<BR>/*填写sockaddr_in 结构*/<BR>bzero ( &addr, sizeof(addr) );<BR>addr.sin_family=AF_INET;<BR>addr.sin_port=htons(PORT);<BR>addr.sin_addr=hton1(INADDR_ANY)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -