//创建一个event_base struct event_base *base = event_base_new(); assert(base != NULL);
//创建并绑定一个event struct event *listen_event; //参数:event_base, 监听的fd,事件类型及属性,绑定的回调函数,给回调函数的参数 listen_event = event_new(base, listener, EV_READ | EV_PERSIST, callback_func, (void*)base); //参数:event,超时时间(struct timeval *类型的,NULL表示无超时设置) event_add(listen_event, NULL);
#include <WinSock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <event2/event.h>
#include <event2/bufferevent.h>
#include<iostream>
#include<cassert>
#pragma comment (lib,"ws2_32.lib")
#include<ws2tcpip.h>
#define LISTEN_PORT 9999
#define LIATEN_BACKLOG 32
using namespace std;
/*********************************************************************************
* 函数声明
**********************************************************************************/
//accept回掉函数
void do_accept_cb(evutil_socket_t listener, short event, void *arg);
//read 回调函数
void read_cb(struct bufferevent *bev, void *arg);
//error回调函数
void error_cb(struct bufferevent *bev, short event, void *arg);
//write 回调函数
void write_cb(struct bufferevent *bev, void *arg);
/*********************************************************************************
* 函数体
**********************************************************************************/
//accept回掉函数
void do_accept_cb(evutil_socket_t listener, short event, void *arg)
{
//传入的event_base指针
struct event_base *base = (struct event_base*)arg;
//socket描述符
evutil_socket_t fd;
//声明地址
struct sockaddr_in sin;
//地址长度声明
socklen_t slen = sizeof(sin);
//接收客户端
fd = accept(listener, (struct sockaddr *)&sin, &slen);
if (fd < 0)
{
perror("error accept");
return;
}
printf("ACCEPT: fd = %un", fd);
////注册一个bufferevent_socket_new事件
struct bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
////设置回掉函数
bufferevent_setcb(bev, read_cb, NULL, error_cb, arg);
////设置该事件的属性
bufferevent_enable(bev, EV_READ | EV_WRITE | EV_PERSIST);
}
////read 回调函数
void read_cb(struct bufferevent *bev, void *arg)
{
#define MAX_LINE 256
char line[MAX_LINE + 1];
int n;
//通过传入参数bev找到socket fd
evutil_socket_t fd = bufferevent_getfd(bev);
//
while (n = bufferevent_read(bev, line, MAX_LINE))
{
line[n] = ' ';
printf("fd=%u, read line: %sn", fd, line);
//将获取的数据返回给客户端
bufferevent_write(bev, line, n);
}
}
////error回调函数
void error_cb(struct bufferevent *bev, short event, void *arg)
{
//通过传入参数bev找到socket fd
evutil_socket_t fd = bufferevent_getfd(bev);
//cout << "fd = " << fd << endl;
if (event & BEV_EVENT_TIMEOUT)
{
printf("Timed outn"); //if bufferevent_set_timeouts() called
}
else if (event & BEV_EVENT_EOF)
{
printf("connection closedn");
}
else if (event & BEV_EVENT_ERROR)
{
printf("some other errorn");
}
bufferevent_free(bev);
}
////write 回调函数
void write_cb(struct bufferevent *bev, void *arg)
{
char str[50];
//通过传入参数bev找到socket fd
evutil_socket_t fd = bufferevent_getfd(bev);
//cin >> str;
printf("输入数据!");
scanf_s("%d", &str);
bufferevent_write(bev, &str, sizeof(str));
}
int main()
{
int ret;
evutil_socket_t listener;
WSADATA Ws;
//Init Windows Socket
if (WSAStartup(MAKEWORD(2, 2), &Ws) != 0)
{
return -1;
}
listener = socket(AF_INET, SOCK_STREAM, 0);
assert(listener > 0);
evutil_make_listen_socket_reuseable(listener);
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = 0;
sin.sin_port = htons(LISTEN_PORT);
if (bind(listener, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
perror("bind");
return 1;
}
if (listen(listener, 1000) < 0) {
perror("listen");
return 1;
}
printf("Listening...n");
evutil_make_socket_nonblocking(listener);
struct event_base *base = event_base_new();
assert(base != NULL);
struct event *listen_event;
listen_event = event_new(base, listener, EV_READ | EV_PERSIST, do_accept_cb, (void*)base);
event_add(listen_event, NULL);
event_base_dispatch(base);
printf("The End.");
return 0;
}
/******* 客户端程序 client.c ************/
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include<winsock2.h>
#include<ws2tcpip.h>
#include<iostream>
#pragma comment (lib,"ws2_32.lib")
int main(int argc, char *argv[])
{
WSADATA Ws;
//Init Windows Socket
if (WSAStartup(MAKEWORD(2, 2), &Ws) != 0)
{
return 0;
}
int sockfd;
char buffer[1024];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber, nbytes;
if ((host = gethostbyname("127.0.0.1")) == NULL)
{
fprintf(stderr, "Gethostname errorn");
exit(1);
}
if ((portnumber = atoi("9999"))<0)
{
fprintf(stderr, "Usage:%s hostname portnumberan", argv[0]);
exit(1);
}
/* 客户程序开始建立 sockfd描述符 */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
fprintf(stderr, "Socket Error:%san", strerror(errno));
exit(1);
}
/* 客户程序填充服务端的资料 */
memset(&server_addr,0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portnumber);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
/* 客户程序发起连接请求 */
if (connect(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1)
{
fprintf(stderr, "Connect Error:%san", strerror(errno));
exit(1);
}
while (true)
{
char MESSAGE[] = "hello server..n";
//bufferevent_write(buf_ev,MESSAGE,strlen(MESSAGE));
//
if (-1 == (::send(sockfd, MESSAGE, strlen(MESSAGE), 0)))
{
printf("the net has a error occured..");
break;
}
if ((nbytes = recv(sockfd, buffer, 1024,0)) == -1)
{
fprintf(stderr, "read error:%sn", strerror(errno));
exit(1);
}
buffer[nbytes] = ' ';
printf("I have received:%sn", buffer);
memset(buffer, 0, 1024);
Sleep(2);
}
/* 结束通讯 */
closesocket(sockfd);
exit(0);
return 0;
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有