转自: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发送和接收
接收函数: