编写套接字通信程序的步骤:
①socket:创建套接字
-------------------------------------------------------------------------------------
#include <sys/types.h>
#include
<sys/socket.h>
int socket(
int domain,
int type,
int protocol);
domain(套接字域)取值:
AF_UNIX:unix文件系统套接字
AF_INET:因特网套接字
type(套接字类型)取值:
SOCK_STREAM:TCP流套接字
SOCK_DGRAM:UDP数据报套接字
protocol取值:
0(默认协议)
②sockaddr_in/sockaddr_un:套接字初始化
-------------------------------------------------------------------------------------
#include <sys/un.h>
struct
sockaddr_un {
sa_family_t sun_family; /*AF_UNIX*/
char sun_path[]; /*pathname*/
}
---------------------------------
#include <netinet/in.h>
struct
sockaddr_in {
short int
sin_family; /*AF_INET*/
unsigned short int sin_port; /*Port number*/
struct in_addr sin_addr; /*Internet address*/
}
其中IP地址结构in_addr被定义为:
struct
in_addr {
unsigned long
int s_addr;
};
③bind:命名套接字
-------------------------------------------------------------------------------------
#include <sys/socket.h>
int
bind( int socket,
const
struct sockaddr *address,
size_t address_len);
④listen:服务器创建套接字队列
-------------------------------------------------------------------------------------
#include <sys/socket.h>
int
listen(int socket, int backlog)
backlog表示队列长度,队列中未处理连接数大于backlog值时,拒绝连接
listen函数成功时返回0,失败时返回-1
⑤accept:服务器接受连接
-------------------------------------------------------------------------------------
#include <sys/socket.h>
int
accept( int socket,
struct
sockaddr *address,
size_t
*address_len);
accept系统调用只有当有客户试图连接到由socket参数指定的套接字上时才返回。
accept函数将创建一个新套接字来与该客户进行通信,并返回新套接字的描述符。
当有未处理客户连接时,accept函数将返回一个新的套接字文件描述符。
当发生错误时, accept函数返回-1
若套接字队列中无未处理连接,accept将其阻塞(程序将暂停)直到有客户建立连接。
int flags = fcntl(socket, F_GETFL, 0);
fcntl(socket, F_SETFL, O_NONBLOCK|flags);
⑥connect:客户端请求连接
-------------------------------------------------------------------------------------
#include <sys/socket.h>
int
connect( int socket,
const
struct sockaddr *address,
size_t address_len);
将参数socket指定的套接字连接到参数address指定的服务器套接字,
address指向的结构长度有参数address_len指定。
参数socket指定的套接字必须是通过socket条用获得的一个有效的文件描述符。
connect成功时返回0,失败时返回-1。
如果连接不能立刻建立,connect调用将阻塞一段不确定的超时时间。
一旦这个超时时间到达,连接将被放弃,connect调用失败。
但如果connect调用被一个信号中断,blah, blah——
⑦close:关闭套接字
-------------------------------------------------------------------------------------
调用close函数终止服务器与客户端上套接字的连接,就如同底层文件描述符进行关闭一样。
连接的两端都关闭套接字。对服务器来说read调用返回0时关闭套接字。
但如果套接字是一个面向连接类型的,并设置了SOCK_LINGER选项,
close调用会在该套接字还有为传输数据时阻塞。
这是《linux程序设计》第4版第15章的笔记,版权归原书作者及译者所有
原文:http://www.cnblogs.com/xiashu/p/3553677.html