网络编程:创建套接字

41 阅读1分钟

创建套接字

服务端套接字

  1. 创建套接字
int socket(int domain, int type, int protocol);
serv_sock = socket(PF_INET, SOCK_STREAM, 0);
  1. 调用bind函数分配IP地址和端口
int bind(int sockfd, const struct sockaddr * myaddr, socklen_t addrlen);

struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[1]));

if (bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1) {
   error_handling("bind() error");
}
  1. 调用listen转为可接收请求状态
int listen(int sockfd, int backlog);

if (listen(serv_sock, 5) == -1) {
     error_handling("listen() error");
}
  1. 调用accept函数接受连接请求
int accept(int sockfd, struct sockaddr * addr, socklen_t * addrlen);

int clnt_sock;
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_size;
clnt_addr_size = sizeof(clnt_addr);
//accept受理连接请求,如果没有连接请求的情况下调用该函数,不会立即返回,直到有连接请求为止.
clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
if (clnt_sock == -1) {
  error_handling("accept() error");
}

客户端套接字

  1. 创建套接字
  2. 调用connect函数向服务端发送连接请求
int  connect(int sockfd, const struct sockaddr * serv_addr, socklen_t addrlen);

struct sockaddr_in serv_addr;
sock = socket(PF_INET, SOCK_STREAM, 0);

memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
//从参数中传入server的IP和port
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
  error_handling("connect() error");
}