1、 Linux 常用 C 函数 接口处理篇accept(接受 socket 连线)相关函数 socket,bind,listen,connect表头文件 #include#include定义函数 int accept(int s,struct sockaddr * addr,int * addrlen);函数说明 accept()用来接受参数 s 的 socket 连线。参数 s 的 socket 必需先经 bind()、listen()函数处理过,当有连线进来时 accept()会返回一个新的 socket 处理代码,往后的数据传送与读取就是经由新的 socket 处理,而原来参数 s 的 s
2、ocket 能继续使用 accept()来接受新的连线要求。连线成功时,参数 addr 所指的结构会被系统填入远程主机的地址数据,参数 addrlen为 scokaddr 的结构长度。关于结构 sockaddr 的定义请参考 bind()。返回值 成功则返回新的 socket 处理代码,失败返回-1,错误原因存于 errno 中。错误代码 EBADF 参数 s 非合法 socket 处理代码。EFAULT 参数 addr 指针指向无法存取的内存空间。ENOTSOCK 参数 s 为一文件描述词,非 socket。EOPNOTSUPP 指定的 socket 并非 SOCK_STREAM。EPERM
3、 防火墙拒绝此连线。ENOBUFS 系统的缓冲内存不足。ENOMEM 核心内存不足。范例 参考 listen()。bind(对 socket 定位)相关函数 socket,accept ,connect,listen表头文件 #include#include定义函数 int bind(int sockfd,struct sockaddr * my_addr,int addrlen);函数说明 bind()用来设置给参数 sockfd 的 socket 一个名称。此名称由参数 my_addr 指向一sockaddr 结构,对于不同的 socket domain 定义了一个通用的数据结构struc
4、t sockaddrunsigned short int sa_family;char sa_data14;sa_family 为调用 socket()时的 domain 参数,即 AF_xxxx 值。sa_data 最多使用 14 个字符长度。此 sockaddr 结构会因使用不同的 socket domain 而有不同结构定义,例如使用 AF_INET domain,其 socketaddr 结构定义便为struct socketaddr_inunsigned short int sin_family;uint16_t sin_port;struct in_addr sin_addr;un
5、signed char sin_zero8;struct in_addruint32_t s_addr;sin_family 即为 sa_familysin_port 为使用的 port 编号sin_addr.s_addr 为 IP 地址sin_zero 未使用。参数 addrlen 为 sockaddr 的结构长度。返回值 成功则返回 0,失败返回-1,错误原因存于 errno 中。错误代码 EBADF 参数 sockfd 非合法 socket 处理代码。EACCESS 权限不足ENOTSOCK 参数 sockfd 为一文件描述词,非 socket。范例 参考 listen()connect
6、(建立 socket 连线)相关函数 socket,bind,listen表头文件 #include#include定义函数 int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);函数说明 conn ect()用来将参数 sockfd 的 socket 连至参数 serv_addr 指定的网络地址。结构 sockaddr 请参考 bind()。参数 addrlen 为 sockaddr 的结构长度。返回值 成功则返回 0,失败返回-1,错误原因存于 errno 中。错误代码 EBADF 参数 sockfd 非合法 so
7、cket 处理代码EFAULT 参数 serv_addr 指针指向无法存取的内存空间ENOTSOCK 参数 sockfd 为一文件描述词,非 socket。EISCONN 参数 sockfd 的 socket 已是连线状态ECONNREFUSED 连线要求被 server 端拒绝。ETIMEDOUT 企图连线的操作超过限定时间仍未有响应。ENETUNREACH 无法传送数据包至指定的主机。EAFNOSUPPORT sockaddr 结构的 sa_family 不正确。EALREADY socket 为不可阻断且先前的连线操作还未完成。范例 /* 利用 socket 的 TCP client此程
8、序会连线 TCP server,并将键盘输入的字符串传送给 server。TCP server 范例请参考 listen() 。*/#include#include#include#include#include#include#include#define PORT 1234#define SERVER_IP “127.0.0.1”main()int s;struct sockaddr_in addr;char buffer256;if(s = socket(AF_INET,SOCK_STREAM,0)#include 定义函数 int sendto ( int s , const void
9、 * msg, int len, unsigned int flags, conststruct sockaddr * to , int tolen )函数说明 sendto() 用来将数据由指定的 socket 传给对方主机。参数 s 为已建好连线的socket,如果利用 UDP 协议则不需经过连线操作。参数 msg 指向欲连线的数据内容,参数flags 一般设 0,详细描述请参考 send()。参数 to 用来指定欲传送的网络地址,结构sockaddr 请参考 bind()。参数 tolen 为 sockaddr 的结果长度。返回值 成功则返回实际传送出去的字符数,失败返回1,错误原因存于
10、 errno 中。错误代码 EBADF 参数 s 非法的 socket 处理代码。EFAULT 参数中有一指针指向无法存取的内存空间。WNOTSOCK canshu s 为一文件描述词,非 socket。EINTR 被信号所中断。EAGAIN 此动作会令进程阻断,但参数 s 的 soket 为补课阻断的。ENOBUFS 系统的缓冲内存不足。EINVAL 传给系统调用的参数不正确。范例 #include #include # include#include#define PORT 2345 /*使用的 port*/main()int sockfd,len;struct sockaddr_in a
11、ddr;char buffer256;/*建立 socket*/if(sockfd=socket (AF_INET,SOCK_DGRAM,0)定义函数 void setservent (int stayopen);函数说明 setservent()用来打开/etc/services,如果参数 stayopen 值为 1,则接下来的getservbyname()或 getservbyport()将补回自动关闭文件。setsockopt(设置 socket 状态)相关函数 getsockopt表头文件 #include#include定义函数 int setsockopt(int s,int le
12、vel,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 送出的数据包不要利用路由设备来传
13、输。SO_BROADCAST 使用广播方式传送SO_SNDBUF 设置送出的暂存区大小SO_RCVBUF 设置接收的暂存区大小SO_KEEPALIVE 定期确定连线是否已终止。SO_OOBINLINE 当接收到 OOB 数据时会马上送至标准输入设备SO_LINGER 确保数据安全且可靠的传送出去。参数 optval 代表欲设置的值,参数 optlen 则为 optval 的长度。返回值 成功则返回 0,若有错误则返回-1,错误原因存于 errno。附加说明 EBADF 参数 s 并非合法的 socket 处理代码ENOTSOCK 参数 s 为一文件描述词,非 socketENOPROTOOPT
14、 参数 optname 指定的选项不正确。EFAULT 参数 optval 指针指向无法存取的内存空间。范例 参考 getsockopt()。shutdown(终止 socket 通信)相关函数 socket,connect表头文件 #include定义函数 int shutdown(int s,int how);函数说明 shutdown()用来终止参数 s 所指定的 socket 连线。参数 s 是连线中的 socket 处理代码,参数 how 有下列几种情况 :how=0 终止读取操作。how=1 终止传送操作how=2 终止读取及传送操作返回值 成功则返回 0,失败返回-1,错误原因存
15、于 errno。错误代码 EBADF 参数 s 不是有效的 socket 处理代码ENOTSOCK 参数 s 为一文件描述词,非 socketENOTCONN 参数 s 指定的 socket 并未连线socket(建立一个 socket 通信)相关函数 accept,bind,connect,listen表头文件 #include#include定义函数 int socket(int domain,int type,int protocol);函数说明 socket()用来建立一个新的 socket,也就是向系统注册,通知系统建立一通信端口。参数 domain 指定使用何种的地址类型,完整的定
16、义在/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 PVCsPF_APPL
17、ETALK/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 所使用的传输协议编号
18、,通常此参考不用管它,设为 0 即可。返回值 成功则返回 socket 处理代码,失败返回-1。错误代码 EPROTONOSUPPORT 参数 domain 指定的类型不支持参数 type 或 protocol 指定的协议ENFILE 核心内存不足,无法建立新的 socket 结构EMFILE 进程文件表溢出,无法再建立新的 socketEACCESS 权限不足,无法建立 type 或 protocol 指定的协议ENOBUFS/ENOMEM 内存不足EINVAL 参数 domain/type/protocol 不合法范例 参考 connect()。【已有 1 位网友发表了看法】 【打印】 【
19、关闭】相关评论作者: js001sdx 发布日期: 2009-9-29好文共有评论数 1/每页显示数 10我要评论发表评论,与各位同人交流。 我要评论 热点主题 Linux 下的多进程编程初步 Linux 下的软件开发 Unix(Linux)C 编程问题精粹 Linux 和 Unix 安全编程:环境变量 Linux 核心编译 (kernel) 在硬碟建置 Linux 系统之 setup 启动 Java 桌面应用程序设计:SWT 简介 基于 Linux 的网络数据帧捕获方法与思考 关于 C+代码优化的方法总结 编写适用于模拟器的 Linux 代码最新主题 基于 Linux 的网络数据帧捕获方法与
20、思考 在硬碟建置 Linux 系统之 setup 启动 Linux 和 Unix 安全编程:环境变量 Linux 下的多进程编程初步 Unix(Linux)C 编程问题精粹 编写适用于模拟器的 Linux 代码 在 Linux 环境 Python 下开发全文索引 Linux 核心编译 (kernel) 关于 C+代码优化的方法总结 Linux 下的软件开发关注热点Linux 紧张辩论和全球近 40 万 Linux 爱好者热讨当今最热门的开源话题,寻找同城 Linux 人,发表你的见解. 最新主题与激烈辩论主题,5 分钟前由系统自动更新! 24 小时热点 Top20 与一周热点 Top20 主题,15 分钟前由系统自动更新!下载 1000 部免费 Linux 教程,参与 Linux 社区文档的建设.各省 Linux 人:北京 上海 天津 重庆 广东 湖北四川 安徽 湖南 河北 江西 河南陕西 山东 福建 江苏 浙江 山西吉林 辽宁 广西 宁夏 甘肃 贵州云南 新疆 西藏 青海 台湾 海南香港 澳门 内蒙古 黑龙江Linux 精华文档 Linux 同城人(交友)全国大学校园 Linux 人热门栏目推荐: Linux 业界新闻合作 | 关于我们 | 联系我们 | 导航 | 会员注册2010 红联 Powered by SupSite