上一节创建socket时,仅指定了协议类型以及服务类型,但是没有指定具体的socket地址。 bind函数含义如词义,给上述创建的套接字socket绑定一个socket地址。
比喻如下:我们创建了socket(安装电话机)以后,需要进行socket命名(应该去中国联通申请一个电话号码,并将该号码和电话机进行绑定)。
bind函数的Linux头文件以及函数定义如下:
#include<sys/socket.h>
int bind(int sockfd, const stuct sockaddr *my_addr, socklen_t addrlen);
bind函数参数以及返回值如下:
/**
* socket命名
*
* @param sockfd socket文件描述符,上节socket函数返回的值
* @param my_addr socket地址
* @param addrlen socket地址的长度
* @return 函数执行成功返回0,失败返回-1
*/
int bind(int sockfd, const stuct sockaddr *my_addr, socklen_t addrlen);
结合之前socket地址初始化方法,写个程序,完成命名socket。
#include <stdio.h>
#include <stdlib.h> // exit
#include <string.h>
#include <arpa/inet.h> // sockaddr_in
#include <sys/socket.h>
int main(int argc, char *argv[])
{
const char *server_ip = "127.0.0.1"; // IP地址字符串
int server_port = 0x1234;
int server_socket;
server_socket = socket(PF_INET, SOCK_STREAM, 0);
if (server_socket == -1) {
perror("socket create error");
exit(1);
}
printf("socket is %d\n", server_socket);
struct sockaddr_in address;
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_port = htons(server_port);
address.sin_addr.s_addr = inet_addr(server_ip);
if (bind(server_socket, (struct sockaddr*)&address, sizeof(address)) == -1) {
perror("bind error");
exit(1);
}
printf("bind ok\n");
return 0;
}
第13行创建一个socket。
第20~24行初始化一个socket地址,和之前相同。
第26行利用bind函数完成命名socket。
右侧打开bind_test.c文件,试添加bind函数,并编译测试。