#include <stdio.h>\n#include <stdlib.h>\n#include <sys\socket.h>\n#include <sys\types.h>\n#include <sys\stat.h>\n#include <netinet\in.h>\n#include <errno.h>\n#include <unistd.h>\n#include <netdb.h>\n#include <arpa\inet.h>\n#include <sys\time.h>\n#include <string.h>\n#include <event2\event.h>\n#include <mysql\mysql.h>\n\n//宏定义\n#define PORT 1234\nvoid print_time_usec()\n{\n struct tm *ptm_611;\n struct timeval time_611;\n gettimeofday(&time_611, NULL);\n ptm_611 = localtime(&time_611.tv_sec);\n if (ptm_611 != NULL)\n {\n printf("%d-%d-%d:%d:%d:%d:%ld\n",\n ptm_611->tm_year + 1900, ptm_611->tm_mon + 1, ptm_611->tm_mday,\n ptm_611->tm_hour, ptm_611->tm_min, ptm_611->tm_sec,\n time_611.tv_usec % 1000000 / 1000);\n }\n}\n\nvoid receive_callback(evutil_socket_t listenfd_611, short ev, void *user_arg)\n{\n char recvbuf[100];\n char sendbuf[100];\n int num;\n bzero(recvbuf, 100);\n bzero(sendbuf, 100); //清空缓冲区\n num = recv(listenfd_611, recvbuf, 100, 0);\n recvbuf[100] = '\0';\n printf("recv:%s\n", recvbuf);\n if (strcmp(recvbuf, "bye") == 0)\n {\n close(listenfd_611);\n struct event *this_event = event_base_get_running_event((struct event_base *)user_arg);\n event_free(this_event);\n }\n int len = strlen(recvbuf);\n for (int i = 0; i < len / 2; i++)\n {\n char temp = recvbuf[i];\n recvbuf[i] = recvbuf[len - i - 1];\n recvbuf[len - i - 1] = temp;\n }\n\n // 数据库查询部分\n MYSQL *con = mysql_init(NULL);\n if (con == NULL)\n {\n sprintf(sendbuf, "login fail!");\n send(listenfd_611, sendbuf, strlen(sendbuf), 0);\n return;\n }\n if (mysql_real_connect(con, "localhost", "root", "123456", "gzadb", 0, NULL, 0) == NULL)\n {\n sprintf(sendbuf, "login fail!");\n send(listenfd_611, sendbuf, strlen(sendbuf), 0);\n mysql_close(con);\n return;\n }\n\n char *username = strtok(recvbuf, "/");\n char *password = strtok(NULL, "/");\n char query[100];\n sprintf(query, "SELECT * FROM users WHERE username='%s'" , username);\n if (mysql_query(con, query))\n {\n sprintf(sendbuf, "login fail!");\n send(listenfd_611, sendbuf, strlen(sendbuf), 0);\n mysql_close(con);\n return;\n }\n MYSQL_RES *result = mysql_store_result(con);\n if (result == NULL)\n {\n sprintf(sendbuf, "login fail!");\n send(listenfd_611, sendbuf, strlen(sendbuf), 0);\n mysql_close(con);\n return;\n }\n int num_fields = mysql_num_fields(result);\n MYSQL_ROW row;\n if ((row = mysql_fetch_row(result)))\n {\n if (strcmp(row[1], password) == 0)\n {\n sprintf(sendbuf, "login success!");\n }\n else\n {\n sprintf(sendbuf, "login fail!");\n }\n }\n else\n {\n sprintf(sendbuf, "login fail!");\n }\n mysql_free_result(result);\n mysql_close(con);\n\n sprintf(sendbuf, "\nwelcome to server belong to gza611!");\n send(listenfd_611, recvbuf, strlen(recvbuf), 0);\n send(listenfd_611, sendbuf, strlen(sendbuf), 0);\n}\n\nvoid accept_callback(evutil_socket_t listenfd_611, short ev, void *user_arg)\n{\n //接受连接请求\n int clientfd_611;\n struct sockaddr_in client_611;\n int len_611 = sizeof(client_611);\n struct event_base *base_611 = (struct event_base *)user_arg;\n clientfd_611 = accept(listenfd_611, (struct sockaddr *)&client_611, &len_611);\n //接收客户端数据\n struct event *ev_receive_611 = event_new(base_611, clientfd_611, EV_READ | EV_PERSIST, receive_callback, user_arg);\n event_add(ev_receive_611, NULL);\n if (clientfd_611 == -1)\n {\n perror("accept");\n exit(1);\n }\n print_time_usec();\n\n printf("client port:%d\n", client_611.sin_port);\n printf("client IP:%s\n\n", inet_ntoa(client_611.sin_addr));\n}\n\nint main(int argc, char const argv[])\n{\n int listenfd_611;\n struct sockaddr_in server = {0};\n struct sockaddr_in client;\n int SERVERPORT_611 = 1234, val_611 = 1;\n int backlog_611 = 5;\n //if创建socket : 得到一个文件描述符\n listenfd_611 = socket(AF_INET, SOCK_STREAM, 0);\n if (listenfd_611 == -1)\n {\n perror("socket");\n exit(1);\n }\n printf("listenfd=%d\n", listenfd_611);\n //绑定\n server.sin_family = AF_INET;\n server.sin_port = htons(SERVERPORT_611);\n server.sin_addr.s_addr = htonl(INADDR_ANY);\n bzero(&(server.sin_zero), 8);\n //bind(listenfd_611,(struct sockaddr)&server,sizeof(server));\n if (bind(listenfd_611, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1)\n {\n perror("bind");\n exit(1);\n }\n //监听\n if (listen(listenfd_611, backlog_611) == -1)\n {\n perror("listen");\n exit(1);\n }\n //创建一个event_base对象\n struct event_base *base_611 = event_base_new();\n //创建一个event,用来处理accept ->需要一个回调函数\n struct event *ev_accept_611 = event_new(base_611, listenfd_611, EV_READ | EV_PERSIST, accept_callback, (void *)base_611);\n //将事件加入集合\n event_add(ev_accept_611, NULL);\n //执行事件派发\n event_base_dispatch(base_611);\n //释放event\n event_base_free(base_611);\n\n close(listenfd_611);\n return 0;\n


原文地址: https://www.cveoy.top/t/topic/pqku 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录