一、socket介绍
如今社会是万物互联的时代,因此网络成为了最为关键的部分。人能通过人的大脑根据人的外貌特征来准确的区分。那么计算机是怎么识别计算机的呢,这时我们需要给它门一个身份来确定。网络层的“ip地址”能够识别网络中的唯一主机,“端口”能够确定主机中的唯一进程,这样确定了地址信息之后就能进行通信了。如今采用TCP/IP协议大多采用socket进行通信,而且大多部分多着C/S模型,所以学习socket对于嵌入式来说是必不可少的。
二、创建socket客户端的流程
三、各函数的介绍与运用
1、socket
socket函数(系统调用)原型为int socket(int domain, int type, int protocol);domain参数指定通信域,用来指定网络层协议,现在网络基本都是支持IPV4 或 IPV6协议的,这是domain参数可设定为AF_INET(网络地址为IPV4时)、AF_INET6(网络地址为IPV6时)。
type参数为当前定义的类型是套接字具有指定的类型,该类型指定通信语义,又来指定传输层协议,通常我们所使用的就是TCP(提供顺序的、可靠的、双向的、基于连接的字节流) UDP(固定最大长度的无连接、不可靠消息。)两种协议,SOCK_STREAM指定TCP,SOCK_DGRAM指定UDP。
protoc参数指定要与套接字一起使用的特定协议。通常只有一个协议可以支持给定协议族中的特定套接字类型,在这种情况下,协议可以指定为0。
返回值:成功时,将返回新套接字的文件描述符(类型为:int)。出现错误时返回-1,并正确设置errno。
if((sockfd=socket(AF_INET, SOCK_STREAM, 0))<0)
{
printf("creat socket failure:%s\n",strerror(errno));
return -1;
}
代表着创建了一个IPV4地址网络协议、TCP协议的socket成功将返回值赋给sockfd,出错将打印出错信息,strerror函数的作用是:返回一个指向字符串的指针,该字符串描述参数errnum中传递的错误代码。调用此函数linux内核会将错误原因告诉我们。socket函数的更具体的解释可参考man手册
2、connect
connect函数原型int connect(int sockfd, const struct sockaddr*addr,socklen_t addrlen)。将文件描述符sockfd引用的套接字连接到addr指定的地址。addrlen参数指定addr的大小。
第一个参数sockfd是socket所创建的一个文件描述符,第二个参数addr中地址的格式由sockfd决定。第三个参数addrlen指定addr的大小,下面将来介绍struct sockaddr_in 和 struct sockaddr 两中结构体:
struct sockaddr_in类型进行赋值时,注意将主机字节序转换位网络字节序。sin_family与socket函数中参数domain相对应,可设为AF_INET(网络地址为IPV4时)、AF_INET6(网络地址为IPV6时),sin_port 指定了服务器的端口,但是我们要传进去的port原型一般设为int型,此时我们需要函数htons将port转换为网络字节序,sin_addr的内容存储着服务器的IP,用inet_aton函数将主机字节序准换为网络字节序。部分代码如下:
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
inet_aton(servrip,&servaddr.sin_addr);
if((rv=connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)))<0)
{
printf("connect to server ip:%s port:%d failure:%s\n",servrip,port,strerror