recvfrom
(经
socket
接收数据)
|
相关函数
|
recv
,
recvmsg
,
send
,
sendto
,
socket
|
表头文件
|
#include<sys/types.h>
#include<sys/socket.h>
|
定义函数
|
int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *fromlen);
|
函数说明
|
recv()
用来接收远程主机经指定的
socket
传来的数据,并把数据存到由参数
buf
指向的内存空间,参数
len
为可接收数据的最大长度。参数
flags
一般设
0
,其他数值定义请参考
recv()
。参数
from
用来指定欲传送的网络地址,结构
sockaddr
请参考
bind()
。参数
fromlen
为
sockaddr
的结构长度。
|
返回值
|
成功则返回接收到的字符数,失败则返回
-1
,错误原因存于
errno
中。
|
错误代码
|
EBADF
参数
s
非合法的
socket
处理代码
EFAULT
参数中有一指针指向无法存取的内存空间。
ENOTSOCK
参数
s
为一文件描述词,非
socket
。
EINTR
被信号所中断。
EAGAIN
此动作会令进程阻断,但参数
s
的
socket
为不可阻断。
ENOBUFS
系统的缓冲内存不足
ENOMEM
核心内存不足
EINVAL
传给系统调用的参数不正确。
|
范例
|
/*
利用
socket
的
UDP client
*
此程序会连线
UDP server
,并将键盘输入的字符串传给
server
。
* UDP server
范例请参考
sendto
()。
*/
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/typs.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define PORT 2345
#define SERVER_IP “127.0.0.1”
main()
{
int s,len;
struct sockaddr_in addr;
int addr_len =sizeof(struct sockaddr_in);
char buffer[256];
/*
建立
socket*/
if ((s = 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.s_addr = inet_addr(SERVER_IP);
while(1)
{
bzero(buffer,sizeof(buffer));
/*
从标准输入设备取得字符串
*/
len =read(STDIN_FILENO,buffer,sizeof(buffer));
/*
将字符串传送给
server
端
*/
sendto(s,buffer,len,0,&addr,addr_len);
/*
接收
server
端返回的字符串
*/
len = recvfrom(s,buffer,sizeof(buffer),0,&addr,&addr_len);
printf(“receive: %s”,buffer);
}
}
|
执行
|
(
先执行
udp server
再执行
udp client)
hello /*
从键盘输入字符串
*/
receive: hello /*server
端返回来的字符串
*/
|
|
recvmsg
(经
socket
接收数据)
|
相关函数
|
recv
,
recvfrom
,
send
,
sendto
,
sendmsg
,
socket
|
表头文件
|
#include<sys/types.h>
#include<sys/socktet.h>
|
定义函数
|
int recvmsg(int s,struct msghdr *msg,unsigned int flags);
|
函数说明
|
recvmsg()
用来接收远程主机经指定的
socket
传来的数据。参数
s
为已建立好连线的
socket
,如果利用
UDP
协议则不需经过连线操作。参数
msg
指向欲连线的数据结构内容,参数
flags
一般设
0
,详细描述请参考
send()
。关于结构
msghdr
的定义请参考
sendmsg()
。
|
返回值
|
成功则返回接收到的字符数,失败则返回
-1
,错误原因存于
errno
中。
|
错误代码
|
EBADF
参数
s
非合法的
socket
处理代码。
EFAULT
参数中有一指针指向无法存取的内存空间
ENOTSOCK
参数
s
为一文件描述词,非
socket
。
EINTR
被信号所中断。
EAGAIN
此操作会令进程阻断,但参数
s
的
socket
为不可阻断。
ENOBUFS
系统的缓冲内存不足
ENOMEM
核心内存不足
EINVAL
传给系统调用的参数不正确。
|
范例
|
参考
recvfrom()
。
|
|
send
(经
socket
传送数据)
|
相关函数
|
sendto
,
sendmsg
,
recv
,
recvfrom
,
socket
|
表头文件
|
#include<sys/types.h>
#include<sys/socket.h>
|
定义函数
|
int send(int s,const void * msg,int len,unsigned int falgs);
|
函数说明
|
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
传给系统调用的参数不正确。
|
范例
|
参考
connect()
|
|
sendmsg
(经
socket
传送数据)
|
相关函数
|
send
,
sendto
,
recv
,
recvfrom
,
recvmsg
,
socket
|
表头文件
|
#include<sys/types.h>
#include<sys/socket.h>
|
定义函数
|
int sendmsg(int s,const strcut msghdr *msg,unsigned int flags);
|
函数说明
|
sendmsg()
用来将数据由指定的
socket
传给对方主机。参数
s
为已建立好连线的
socket
,如果利用
UDP
协议则不需经过连线操作。参数
msg
指向欲连线的数据结构内容,参数
flags
一般默认为
0
,详细描述请参考
send()
。
结构
msghdr
定义如下
struct msghdr {
void *msg_name; /*Address to send to /receive from . */
socklen_t msg_namelen; /* Length of addres data */
strcut iovec * msg_iov; /* Vector of data to send/receive into */
size_t msg_iovlen; /* Number of elements in the vector */
void * msg_control; /* Ancillary dat */
size_t msg_controllen; /* Ancillary data buffer length */
int msg_flags; /* Flags on received message */
};
|
返回值
|
成功则返回实际传送出去的字符数,失败返回
-1
,错误原因存于
errno
|
错误代码
|
EBADF
参数
s
非合法的
socket
处理代码。
EFAULT
参数中有一指针指向无法存取的内存空间
ENOTSOCK
参数
s
为一文件描述词,非
socket
。
EINTR
被信号所中断。
EAGAIN
此操作会令进程阻断,但参数
s
的
socket
为不可阻断。
ENOBUFS
系统的缓冲内存不足
ENOMEM
核心内存不足
EINVAL
传给系统调用的参数不正确。
|
范例
|
参考
sendto()
。
|
|
|
|
|
|
|
|
转载于:https://blog.51cto.com/yiluohuanghun/950655