LINUX 网络编程 相关函数

网络编程
socket函数
#include <sys/types.h> / See NOTES /
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
socket()用于创建一个套接字并返回一个描述符

• The domain 参数制定中网络协议簇;选择的协议将会用于通讯,协议名在 <sys/socket.h>中定义。常用的
• AF_INET IPv4 网络协议
• AF_INET6 IPv6 网络协议
• type是网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM等)。
• SOCK_STREAM表明用的是TCP 协议,这样会提供按顺序的,可靠,双向,面向连接的比特流。
• SOCK_DGRAM 表明用的是UDP协议,这样只会提不可靠,无连接的通信。
• protocol 制定一个协议用于type,正常情况用0代替
• 该函数执行成功是返回新套接字的文件描述符,错误时,返回-1

• bind函数
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
• bind 为套接字 sockfd 指定本地地址 my_addr. my_addr 的长度为 addrlen (字节).传统的叫法是给一个套接字分配一个名
字. 当使用 socket(2), 函数创建一个套接字时,它存在于一个地址空间(地址族), 但还没有给它分配一个名字
• 函数执行成功返回0,否则返回-1,

• htonl, htons, ntohl, ntohs函数
NAME
htonl, htons, ntohl, ntohs - convert values between host and network byte order
SYNOPSIS
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
DESCRIPTION
The htonl() function converts the unsigned integer hostlong from host byte order to network byte order.
The htons() function converts the unsigned short integer hostshort from host byte order to network byte
order.
The ntohl() function converts the unsigned integer netlong from network byte order to host byte order.
The ntohs() function converts the unsigned short integer netshort from network byte order to host byte
order.
• 本次用到的是htons 用于将端口号转换为网络字节序 ,

• INADDR_ANY 绑定所有网卡

• C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。

• listen 函数
#include <sys/socket.h>
int listen(int s, int backlog);
• 在接收连接之前,首先要使用 socket(2) 创建一个套接字,然后调用 listen 使其能够自动接收到来的连接并且为连接队列指
定一个长度限制. 之后就可以使用 accept(2) 接收连接. listen 调用仅适用于 SOCK_STREAM 或者 SOCK_SEQPACKET 类型
的套接字.
• 参数 backlog 指定未完成连接队列的最大长度.如果一个连接请求到达时未完成连接 队列已满,那么客户端将接收到错误
ECONNREFUSED. 或者,如果下层协议支持重发,那么这个连接请求将被忽略,这样客户端 在重试的时候就有成功的机会.
• 函数执行成功时返回0.错误时返回-1,并置相应错误代码. errno

• accept函数
#include <sys/types.h>
#include <sys/socket.h>
int accept(int s, struct sockaddr *addr, socklen_t *addrlen);

DESCRIPTION 描述
accept 函数用于基于连接的套接字 (SOCK_STREAM, SOCK_SEQPACKET 和 SOCK_RDM). 它从未完成连接队列中取出第一个连接
请求,创建一个和参数 s 属性相同的连接套接字,并为这个套接字分配一个文件描述符, 然后以这个描述符返回.新创建的描述
符不再处于倾听状态.原 套接字 s 不受此调用的影响.注意任意一个文件描述符标志 (任何可以被 fcntl以参数 F_SETFL 设
置的值,比如非阻塞式或者异步状态)不会被 accept. 所继承.
• 参数 s 是以 socket(2) 创建,用 bind(2) 绑定到一个本地地址,并且在调用了 listen(2). 之后正在侦听一个连接的套接
字. 参数 addr 是一个指向结构sockaddr的指针.这个结构体以连接实体地址填充. 所谓的连接实体,就是众所周知的网络
层.参数 addr 所传递的真正的地址格式依赖于所使用的套接字族. (参见 socket(2) 和各协议自己的手册页). addrlen 是
一个实时参数: 它的大小应该能够足以容纳参数 addr 所指向的结构体;在函数返回时此参数将以字节数表示出返回地址的 实
际长度.若 addr 使用NULL作为参数,addrlen将也被置为NULL.
• 如果队列中没有未完成连接套接字,并且套接字没有标记为非阻塞式, accept 将阻塞直到一个连接到达.如果一个套接字被标
记为非阻塞式而队列 中没有未完成连接套接字, accept 将返回EAGAIN.
• 使用 select(2) 或者 poll(2). 可以在一个套接字上有连接到来时产生事件.当尝试一个新的连接时 套接字读就绪,这样我
们就可以调用 accept 为这个连接获得一个新的套接字.此外,你还可以设置套接字在唤醒时 接收到信号 SIGIO; 细节请参见
socket(7)
• 对于那些需要显式确认的协议,比如 DECNet, accept 可以看作仅仅从队列中取出下一个连接而不做确认.当在这个新的文件
描述符上进行普通读写操作时暗示了确认,当关闭这个新的套接字时暗 示了拒绝.目前在Linux上只有DECNet有这样 的含义.

• connect函数
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
• sockfd为socket返回的文件描述符
• addr 为sockaddr_in结构体的地址 ,并将其强制转换为const struct sockaddr ,格式为(const struct sockaddr *)&addr
• addrlen 可直接为sizeof(addr)
• 成功时返回0,失败返回-1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值