mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-12-14 17:00:52 +08:00
111 lines
2.5 KiB
C++
111 lines
2.5 KiB
C++
#include "pch.h"
|
|
#include "Resource.h"
|
|
#include "WinFiberDlg.h"
|
|
#include "afxdialogex.h"
|
|
#include "FiberConnect.h"
|
|
|
|
CFiberConnect::CFiberConnect(CWinFiberDlg& hWin, const char* serverAddr, int count)
|
|
: m_hWin(hWin)
|
|
, m_serverAddr(serverAddr)
|
|
, m_count(count)
|
|
{
|
|
}
|
|
|
|
CFiberConnect::~CFiberConnect(void)
|
|
{
|
|
}
|
|
|
|
void CFiberConnect::run(void)
|
|
{
|
|
#if 0
|
|
acl::string serverAddr(m_serverAddr);
|
|
char *addr = serverAddr.c_str();
|
|
char *port_s = strchr(addr, ':');
|
|
|
|
ASSERT(port_s && *(port_s + 1));
|
|
*port_s++ = 0;
|
|
|
|
struct sockaddr_in sa;
|
|
int len = sizeof(sa);
|
|
memset(&sa, 0, sizeof(sa));
|
|
sa.sin_family = AF_INET;
|
|
sa.sin_port = htons(atoi(port_s));
|
|
sa.sin_addr.s_addr = inet_addr(addr);
|
|
|
|
socket_t sock = acl_fiber_socket(AF_INET, SOCK_STREAM, 0);
|
|
|
|
if (acl_fiber_connect(sock, (const struct sockaddr*) &sa, len) < 0)
|
|
printf("connect %s error %s\r\n", m_serverAddr.c_str(),
|
|
acl::last_serror());
|
|
else
|
|
doEcho(sock);
|
|
|
|
acl_fiber_close(m_sock);
|
|
#else
|
|
acl::socket_stream conn;
|
|
if (!conn.open(m_serverAddr, 2, 10)) {
|
|
printf("connect %s error %s\r\n", m_serverAddr.c_str(),
|
|
acl::last_serror());
|
|
} else {
|
|
doEcho(conn);
|
|
}
|
|
#endif
|
|
|
|
m_hWin.OnFiberConnectExit(this);
|
|
}
|
|
|
|
void CFiberConnect::doEcho(socket_t sock)
|
|
{
|
|
char buf[1024];
|
|
const char* s = "hello world\r\n";
|
|
|
|
int i;
|
|
for (i = 0; i < m_count; i++) {
|
|
if (acl_fiber_send(sock, s, (int) strlen(s), 0) < 0) {
|
|
printf("%s(%d): send error %s\r\n",
|
|
__FILE__, __LINE__, acl::last_serror());
|
|
break;
|
|
}
|
|
int n = acl_fiber_recv(sock, buf, sizeof(buf) - 1, 0);
|
|
if (n <= 0) {
|
|
printf("%s(%d): read error %s\r\n",
|
|
__FILE__, __LINE__, acl::last_serror());
|
|
break;
|
|
}
|
|
buf[n] = 0;
|
|
printf(">>read=%s\r\n", buf);
|
|
}
|
|
printf("Echo over, fd=%u, total=%d, count=%d\r\n", (int) sock, m_count, i);
|
|
}
|
|
|
|
void CFiberConnect::doEcho(acl::socket_stream& conn)
|
|
{
|
|
char buf[1024];
|
|
const char* s = "hello world\r\n";
|
|
|
|
int delay = 100;
|
|
printf("Begin sleep %d ms\r\n", delay);
|
|
acl::fiber::delay(delay);
|
|
printf("Begin do echo ...\r\n");
|
|
|
|
int i;
|
|
for (i = 0; i < m_count; i++) {
|
|
if (conn.write(s, strlen(s)) == -1) {
|
|
printf("%s(%d): write error %s\r\n",
|
|
__FILE__, __LINE__, acl::last_serror());
|
|
break;
|
|
}
|
|
int n = conn.read(buf, sizeof(buf) - 1, false);
|
|
if (n == -1) {
|
|
printf("%s(%d): read error %s\r\n",
|
|
__FILE__, __LINE__, acl::last_serror());
|
|
break;
|
|
}
|
|
buf[n] = 0;
|
|
//printf(">>read=%s\r\n", buf);
|
|
}
|
|
|
|
printf("%s(%d): echo over, fd=%u, total=%d, count=%d\r\n",
|
|
__FILE__, __LINE__, (int) conn.sock_handle(), m_count, i);
|
|
}
|