1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
#include <event2/event.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h>
#define SERVER_IP "127.0.0.1" #define SERVER_PORT 9090 #define BUFFER_SIZE 1024
struct event_base *base = NULL; evutil_socket_t client_socket = -1;
static void connect_callback(int fd, short which, void *arg); static void read_callback(int fd, short which, void *arg); static void write_callback(int fd, short which, void *arg);
void read_user_input(int client_socket){ char buffer[BUFFER_SIZE]; memset(buffer, 0, sizeof(buffer)); printf("请输入要发送的数据: "); fgets(buffer, sizeof(buffer), stdin);
buffer[strlen(buffer)-2] = '\0'; ssize_t nwrote = send(client_socket, buffer, strlen(buffer), 0); if (nwrote <= 0) { if (nwrote < 0 && errno != EAGAIN && errno != EWOULDBLOCK) { perror("发送数据失败"); } printf("服务器已断开连接。\n"); event_base_loopexit(base, NULL); return; }
printf("发送数据: %.*s\n", (int)nwrote, buffer); }
void init_client() { base = event_base_new(); if (!base) { fprintf(stderr, "无法初始化事件基对象。\n"); exit(EXIT_FAILURE); }
client_socket = socket(AF_INET, SOCK_STREAM, 0); if (client_socket < 0) { perror("创建客户端套接字失败"); exit(EXIT_FAILURE); }
struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0) { perror("服务器 IP 地址解析失败"); exit(EXIT_FAILURE); }
struct event *connect_event = event_new(base, client_socket, EV_WRITE, connect_callback, &server_addr); if (!connect_event) { perror("创建连接事件失败"); exit(EXIT_FAILURE); } event_add(connect_event, NULL);
event_base_dispatch(base); }
static void connect_callback(int fd, short which, void *arg) { struct sockaddr_in *server_addr = (struct sockaddr_in *)arg; if (connect(fd, (struct sockaddr *)server_addr, sizeof(*server_addr)) < 0) { perror("连接服务器失败"); exit(EXIT_FAILURE); }
struct event *read_event = event_new(base, client_socket, EV_READ | EV_PERSIST, read_callback, NULL); if (!read_event) { perror("创建读事件失败"); exit(EXIT_FAILURE); } event_add(read_event, NULL);
struct event *write_event = event_new(base, client_socket, EV_WRITE, write_callback, NULL); if (!write_event) { perror("创建写事件失败"); exit(EXIT_FAILURE); } event_add(write_event, NULL);
printf("连接到服务器:%s:%d 成功。\n", SERVER_IP, SERVER_PORT); }
static void read_callback(int fd, short which, void *arg) { char buffer[BUFFER_SIZE]; memset(buffer, 0, sizeof(buffer));
ssize_t nread = recv(fd, buffer, sizeof(buffer) - 1, 0); if (nread <= 0) { if (nread < 0 && errno != EAGAIN && errno != EWOULDBLOCK) { perror("读取数据失败"); } printf("服务器已断开连接。\n"); event_base_loopexit(base, NULL); return; }
printf("收到数据: %.*s\n\n", (int)nread, buffer);
read_user_input(fd);
}
static void write_callback(int fd, short which, void *arg) { char buffer[BUFFER_SIZE]; memset(buffer, 0, sizeof(buffer)); read_user_input(fd); }
int main() { init_client(); event_base_free(base); close(client_socket); return EXIT_SUCCESS; }
|