Linux 套接字

转自:http://blog.sina.com.cn/s/blog_7c626ff60101b3x0.html
1.创建套接字(服务器段还是客户端都要的)
int socket(int domain,int type,int protocol);
第一个参数domain套接字地址族
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 使用不连续不可信赖的数据包连接,即UDP
SOCK_SEQPACKET 提供连续可信赖的数据包连接
SOCK_RAW 提供原始网络协议存取
SOCK_RDM 提供可信赖的数据包连接
SOCK_PACKET 提供和网络驱动程序直接通信。
第三个是设置协议
0:表示由系统在当前的domain选择适合的协议类型(一般设置为0)
IPPROTO_TCP:TCP协议
IPPTOTO_UDP:UDP协议
IPPROTO_SCTP:SCTP协议(不常见http://my.oschina.net/alphajay/blog/4727)
IPPROTO_TIPC:tTIPC协议(不常见http://hi.baidu.com/jeanvahe/item/e2317e3166762c82c3cf291a)
返回值  失败返回-1 这里返回不是-1就好了,(可以忽略大致解释下,Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。 Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket"意味着为一个Socket数据结构分配存储空间。 Socket执行体为你管理描述符表。两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。)
其中失败可以查看errno
EPROTONOSUPPORT             参数domain指定的类型不支持参数type或protocol指定的协议
ENFILE                                        核心内存不足,无法建立新的socket结构
EMFILE                                        进程文件表溢出,无法再建立新的socket
EACCESS                                  权限不足,无法建立type或protocol指定的协议
ENOBUFS/ENOMEM                 内存不足
EINVAL                                         参数domain/type/protocol不合法
2.解释下sockaddr和sockaddr_in
你之后用bind绑定端口等等函数会遇到,用来指明地址信息
struct sockaddr{
       sa_family_t   sa_family;    
       char               sa_data[4];  
};
但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构
sockaddr_in{
       sa_family_t        sin_family;       
       uint16_t              sin_port;         
       struct   in_addr  sin_addr;         
       unsigned            sin_zero[8];    
};
struct   in_addr{
       uint32_t             s_addr;           
};
解释下sockaddr_in结构体里的成员
sin_family:与通用套接字定义中的sa_family相同,初始化为AF_INET或PF_INET。
sin_port:为端口号,必须是网络字节序的形式,初始化为使用htons(端口号)函数
sin_addr:具体定义在struct in_addr结构中,必须是网络字节序的形式,代表IP地址,实际为一个32位无符号整数.
sin_zero[8]:占位字节,使整个结构以16字节的形式对齐,它并不被使用,所以不需要初始化。
3.TCP中I/O发送和接收
接收函数:

你可能感兴趣的:(Linux 套接字)