/**
* @file socklib.c
* @author your name (you@domain.com)
* @brief make_socket_server 创建一个socket服务端
* @version 0.1
* @date 2022-04-15
*
* @copyright Copyright (c) 2022
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <strings.h>
#include <netinet/in.h>
#include <unistd.h>
#include <netdb.h>
#define ERROR_CODE -1
#define BACKLOG 1
#define oops(m) \
{ \
perror(m); \
exit(EXIT_FAILURE); \
}
#define exit_on_error(msg) \
{ \
printf("%s\n", msg); \
exit(EXIT_FAILURE); \
}
/**
* @brief int portnum 端口
*
* @return int -1 error,or socket fd
*/
int make_socket_server(int);
int make_socket_server(int portnum) {
int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (sock_fd == ERROR_CODE)
{
return ERROR_CODE;
}
struct sockaddr_in sock_addr;
char hostname[BUFSIZ];
bzero(&sock_addr, sizeof(sock_addr));
sock_addr.sin_family = AF_INET;
sock_addr.sin_port = htons(portnum);
if (gethostname(hostname, BUFSIZ) == ERROR_CODE)
{
close(sock_fd);
return ERROR_CODE;
}
struct hostent *host_addr = gethostbyname(hostname);
if (host_addr == NULL)
{
close(sock_fd);
return ERROR_CODE;
}
bcopy(host_addr->h_addr_list[0], &sock_addr.sin_addr, host_addr->h_length);
if (bind(sock_fd, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) == ERROR_CODE)
{
close(sock_fd);
return ERROR_CODE;
}
if (listen(sock_fd, BACKLOG) == ERROR_CODE)
{
close(sock_fd);
return ERROR_CODE;
}
return sock_fd;
}