Linux操作系统网络编程函数
listen system call
listen()监听套接字上的连接
listen(int sockfd, int backlog) ;
2.被动监听的socket
3.需要在此前调用bind()函数,否则由系统指定一个随机的端口
4.成功返回0,失败返回-1。
连接队列
1.一个新的Client的连接请求先被放在连接队列中,等待Server程序调用accept函数接受连接请求
cklog指的就是接收队列的长度,亦即Server程序调用accept函数之前最大允许的连接请求数,多余的连接请求将被拒绝
accept system call
accept()函数将响应连接请求,建立连接
accept(int sockfd,struct sockaddr * addr,int * addrlen);
cept缺省是阻塞函数,阻塞直到有连接请求
ckfd:被动(监听)的socket描述符
4.如果成功,返回一个新的socket描述符(connected socket descriptor)来描述该连接。这个连接用来与特定的Client交换信息,原来的socket描述符继续保持非连接监听。如果失败则返回-1
dr将在函数调用后被填入连接对方的地址信息,如对方的IP、端口等。
connect system call
客户端使用connect()函数连接到主机
int connect(int sockfd, struct sockaddr * servaddr, int addrlen) ;
主动的socket
servaddr是事先填写好的结构,Server的IP和端口都在该数据结构中指定。
通常connect将阻塞直到服务器响应为止。
成功返回0,失败返回-1。
send/recv
面向连接的socket数据通讯
int send(int sockfd, const void * msg, size_t len, int flag ) ;
int recv(int sockfd, void * buf, size_t len, int flag ) ;
数据发送/接收函数,成功返回实际发送/接收的字节数,失败返回-1
与write/read比较
ssize_t write(int fd, const void * buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
flag:
nd:MSG_OOB, MSG_DONTROUTE,MSG_DONTWAIT,MSG_NOSIGNAL, ...
cv:MSG_OOB, MSG_PEEK,MSG_WAITALL,MSG_NOSIGNAL,…
OOB(out-of-band),一般用于紧急特殊数据。
sendto/recvfrom
面向数据报的socket通讯sendto/recvfrom
int sendto(int sockfd, const void *msg, size_t len, int flags, const
struct sockaddr *to, socketlen_t tolen) ;
int recvfrom(int sockfd, void *buf, size_t len, int flags, struct
sockaddr *from, socklen _t *fromlen);
close&shutdown
close关闭套接字
close(int sockfd);
shutdown按指定方式关闭套接字
shutdown(int sockfd, int how);
w:SHUT_RD,SHUT_WR,SHUT_RDWR
shutdown直接对TCP连接进行操作,close只是对套接字描述符操作。
getsockopt&setsockopt
检查与修改套接字选项
int getsockopt(int socket, int level, int optname,
void *optval, socklent *optlen-ptr)
int setsockopt(int socket, int level, int optname,
void *optval, socklent optlen)
level为操作级别,当为普通socket级时,设为SOL_ SOCKET,否则设为操作控制选项对应的协议号,如TCP选项为IPPROTO_TCP,IP选项为IPPROTO_IP。
Host name and address conversions
Files:
1./etc/nf, /etc/hosts
Functions
#include
struct hostent *gethostbyname(const char *name);
struct hostent *gethostbyaddr(const char *addr, size_t len, int format);
struct hostent
struct hostent {
char *h_name; /* official name of host */
char **h_aliases; /* alias list * /
int h_addrtype; /* host address type, AF_INET/ AF _INET6 */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses */
};