sendto
(经
socket
传送数据)
|
|
相关函数
|
send , sendmsg,recv , recvfrom , socket
|
表头文件
|
#include < sys/types.h >
#include < sys/socket.h >
|
定义函数
|
int sendto ( int s , const void * msg, int len, unsigned int flags, const struct sockaddr * to , int tolen ) ;
|
函数说明
|
sendto()
用来将数据由指定的
socket
传给对方主机。参数
s
为已建好连线的
socket,
如果利用
UDP
协议则不需经过连线操作。参数
msg
指向欲连线的数据内容,参数
flags
一般设
0
,详细描述请参考
send()
。参数
to
用来指定欲传送的网络地址,结构
sockaddr
请参考
bind()
。参数
tolen
为
sockaddr
的结果长度。
|
返回值
|
成功则返回实际传送出去的字符数,失败返回-
1
,错误原因存于
errno
中。
|
错误代码
|
EBADF
参数
s
非法的
socket
处理代码。
EFAULT
参数中有一指针指向无法存取的内存空间。
WNOTSOCK
canshu s
为一文件描述词,非
socket
。
EINTR
被信号所中断。
EAGAIN
此动作会令进程阻断,但参数
s
的
soket
为补课阻断的。
ENOBUFS
系统的缓冲内存不足。
EINVAL
传给系统调用的参数不正确。
|
范例
|
#include < sys/types.h >
#include < sys/socket.h >
# include <netinet.in.h>
#include <arpa.inet.h>
#define PORT 2345 /*
使用的
port*/
main()
{
int sockfd,len;
struct sockaddr_in addr;
char buffer[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(“receive from %s/n “ , inet_ntoa( addr.sin_addr));
/*
将字串返回给
client
端
*/
sendto(sockfd,buffer,len,0,&addr,addr_len);”
}
}
|
执行
|
请参考
recvfrom()
|
setprotoent
(打开网络协议的数据文件)
|
|
相关函数
|
getprotobyname, getprotobynumber, endprotoent
|
表头文件
|
#include <netdb.h>
|
定义函数
|
void setprotoent (int stayopen);
|
函数说明
|
setprotoent()
用来打开
/etc/protocols
,
如果参数
stayopen
值为
1
,则接下来的
getprotobyname()
或
getprotobynumber()
将不会自动关闭此文件。
|
setservent
(打开主机网络服务的数据文件)
|
|
相关函数
|
getservent, getservbyname, getservbyport, endservent
|
表头文件
|
#include < netdb.h >
|
定义函数
|
void setservent (int stayopen);
|
函数说明
|
setservent()
用来打开
/etc/services
,如果参数
stayopen
值为
1
,则接下来的
getservbyname()
或
getservbyport()
将补回自动关闭文件。
|
setsockopt
(设置
socket
状态)
|
|
相关函数
|
getsockopt
|
表头文件
|
#include<sys/types.h>
#include<sys/socket.h>
|
定义函数
|
int setsockopt(int s,int level,int optname,const void * optval,,socklen_toptlen);
|
函数说明
|
setsockopt()
用来设置参数
s
所指定的
socket
状态。参数
level
代表欲设置的网络层,一般设成
SOL_SOCKET
以存取
socket
层。参数
optname
代表欲设置的选项,有下列几种数值
:
SO_DEBUG
打开或关闭排错模式
SO_REUSEADDR
允许在
bind
()过程中本地地址可重复使用
SO_TYPE
返回
socket
形态。
SO_ERROR
返回
socket
已发生的错误原因
SO_DONTROUTE
送出的数据包不要利用路由设备来传输。
SO_BROADCAST
使用广播方式传送
SO_SNDBUF
设置送出的暂存区大小
SO_RCVBUF
设置接收的暂存区大小
SO_KEEPALIVE
定期确定连线是否已终止。
SO_OOBINLINE
当接收到
OOB
数据时会马上送至标准输入设备
SO_LINGER
确保数据安全且可靠的传送出去。
|
参数
|
optval
代表欲设置的值,参数
optlen
则为
optval
的长度。
|
返回值
|
成功则返回
0
,若有错误则返回
-1
,错误原因存于
errno
。
|
附加说明
|
EBADF
参数
s
并非合法的
socket
处理代码。
ENOTSOCK
参数
s
为一文件描述词,非
socket
。
ENOPROTOOPT
参数
optname
指定的选项不正确。
EFAULT
参数
optval
指针指向无法存取的内存空间。
|
范例
|
参考
getsockopt()
。
|
shutdown
(终止
socket
通信)
|
|
相关函数
|
socket
,
connect
|
表头文件
|
#include<sys/socket.h>
|
定义函数
|
int shutdown(int s,int how);
|
函数说明
|
shutdown()
用来终止参数
s
所指定的
socket
连线。参数
s
是连线中的
socket
处理代码,参数
how
有下列几种情况
:
how=0
终止读取操作。
how=1
终止传送操作
how=2
终止读取及传送操作
|
返回值
|
成功则返回
0
,失败返回
-1
,错误原因存于
errno
。
|
错误代码
|
EBADF
参数
s
不是有效的
socket
处理代码。
ENOTSOCK
参数
s
为一文件描述词,非
socket
。
ENOTCONN
参数
s
指定的
socket
并未连线。
|
socket
(建立一个
socket
通信)
|
|
相关函数
|
accept
,
bind
,
connect
,
listen
|
表头文件
|
#include<sys/types.h>
#include<sys/socket.h>
|
定义函数
|
int socket(int domain,int type,int protocol);
|
函数说明
|
socket()
用来建立一个新的
socket
,也就是向系统注册,通知系统建立一通信端口。参数
domain
指定使用何种的地址类型,完整的定义在
/usr/include/bits/socket.h
内,底下是常见的协议
:
PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL
UNIX
进程通信协议。
PF_INET?AF_INET
Ipv4
网络协议。
PF_INET6/AF_INET6
Ipv6
网络协议。
PF_IPX/AF_IPX
IPX-Novell
协议。
PF_NETLINK/AF_NETLINK
核心用户接口装置。
PF_X25/AF_X25
ITU-T X.25/ISO-8208
协议。
PF_AX25/AF_AX25
业余无线
AX.25
协议。
PF_ATMPVC/AF_ATMPVC
存取原始
ATM PVCs
。
PF_APPLETALK/AF_APPLETALK
appletalk
(
DDP
)协议。
PF_PACKET/AF_PACKET
初级封包接口
|
参数
|
type
有下列几种数值
:
SOCK_STREAM
提供双向连续且可信赖的数据流,即
TCP
。支持
OOB
机制,在所有数据传送前必须使用
connect()
来建立连线状态。
SOCK_DGRAM
使用不连续不可信赖的数据包连接
SOCK_SEQPACKET
提供连续可信赖的数据包连接
SOCK_RAW
提供原始网络协议存取
SOCK_RDM
提供可信赖的数据包连接
SOCK_PACKET
提供和网络驱动程序直接通信。
protocol
用来指定
socket
所使用的传输协议编号,通常此参考不用管它,设
|
返回值
|
成功则返回
socket
处理代码,失败返回
-1
。
|
错误代码
|
EPROTONOSUPPORT
参数
domain
指定的类型不支持参数
type
或
protocol
指定的协议
ENFILE
核心内存不足,无法建立新的
socket
结构;
EMFILE
进程文件表溢出,无法再建立新的
socket
EACCESS
权限不足,无法建立
type
或
protocol
指定的协议
ENOBUFS
/ENOMEM
内存不足
EINVAL
参数
domain/type/protocol
不合法
|
范例
|
参考
connect()
。
|