2015-01-17 13:40:24|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 网络通信|来源:唯设编程网
本文介绍SOCKET的常用函数,并给出实际例子介绍这些函数的具体用法(本文给出的代码适用于Linux/Unix,经过适当调整就可以用于Windows)。
函数原型:
int socket(int domain, int type, int protocol);
参数说明:
domain:协议域,又称协议族(family)。常用的协议族有AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域Socket)、AF_ROUTE等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
type:指定Socket类型。常用的socket类型有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等。流式Socket(SOCK_STREAM)是一种面向连接的Socket,针对于面向连接的TCP服务应用。数据报式Socket(SOCK_DGRAM)是一种无连接的Socket,对应于无连接的UDP服务应用。
protocol:指定协议。常用协议有IPPROTO_TCP、IPPROTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。
注意:type和protocol不可以随意组合,如SOCK_STREAM不可以跟IPPROTO_UDP组合。当第三个参数为0时,会自动选择第二个参数类型对应的默认协议。
返回值:
函数的意义类似于使用new操作符“构造”了一个“连接”的对象,返回的是连接对象的编号。
如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET(Linux下失败返回-1)。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。
函数原型:
int bind(SOCKET socket, const struct sockaddr* address, socklen_t address_len);
参数说明:
socket:是一个套接字描述符。
address:是一个sockaddr结构指针,该结构中包含了要结合的地址和端口号。
address_len:确定address缓冲区的长度。
返回值:
如果函数执行成功,返回值为0,否则为SOCKET_ERROR。
bind.c代码包含(1)创建套接口和(2)绑定端口的功能,代码如下:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #define PORT (2345) int main() { int sockfd; //套接口描述符 struct sockaddr_in addr; //IPv4地址数据结构 //int addr_len = sizeof(struct sockaddr_in); if ( (sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0 ) //建立socket { perror("socket created error!"); exit(1); } else { printf("socket created successfully! "); printf("socket id:%d ",sockfd); } bzero(&addr,sizeof(struct sockaddr_in)); //清空地址信息 addr.sin_family = AF_INET; addr.sin_port = htons(PORT); // host to number shortint: 端口号为PORT addr.sin_addr.s_addr = htonl(INADDR_ANY); // IP为本机IP if( bind(sockfd, (struct sockaddr*)(&addr), sizeof(struct sockaddr)) < 0 ) { perror("bind error!"); exit(1); } else { printf("bind port successfully! "); printf("local port:%d ",PORT); } return 0; }
运行结果如下:
socket created successfully!
socket id:3
bind port successfully!
local port:2345