简单服务器
编译及执行操作。
#编译及运行
gcc server.c -o server
./server
代码带有注释,参考注释即可。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#define SERVER_PORT (8080)
#define EPOLL_MAX_NUM (2048)
#define BUFFER_MAX_LEN (4096)
char buffer[BUFFER_MAX_LEN];
void str_toupper(char *str)
{
int i;
for (i = 0; i < strlen(str); i ++) {
str[i] = toupper(str[i]);
}
}
int main(int argc, char **argv)
{
int listen_fd = 0;
int client_fd = 0;
/*
struct sockaddr_in
{
sa_family_t sin_ family; // 地址族
uint16_t sin_port; // 16位TCP/UDP端口号
struct in_addr sin_addr; // 32位IP地址
char sin_zero[8]; // 不使用
}
该结构体在#include<arpa/inet.h>中定义,主要解决sockaddr的缺陷,把
端口号和地址分开存储
*/
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
/*
typedef int socketlen_t
主要用于作为accept()的传参,记录struct sockaddr_un的长度
*/
socklen_t client_len;
int epfd = 0;
/*
typedef union epoll_data
{
void* ptr;
int fd;
unit32_t u32;
unit64_t u64
} epoll_data_t;
struct epoll_event
{
uint32_t events; // 明确表示事件类型,为EPOLLIN或EPOLLOUT等
epoll_data_t data; // 传参,比如传输socket句柄或者线程间通信
}
参考链接: https://www.dazhuanlan.com/2019/12/09/5dedf96a76470/
*/
struct epoll_event event, *my_events;
/*