Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

1.6.6 版本,windows 64位下 udp接收时 tb_socket_wait进程会退出 #175

Closed
walletiger opened this issue Oct 18, 2021 · 4 comments
Closed

Comments

@walletiger
Copy link

以下是测试代码,跟踪到 tb_co_schedular_switch->tb_context_jump 进程就退出了。
// test_main.cpp
#include <tbox/tbox.h>

static tb_void_t test_run(tb_cpointer_t priv)
{
tb_socket_ref_t sock_fd;
tb_ipaddr_t addr, peer_addr;
tb_size_t ret;

(void)priv;     
sock_fd = tb_socket_init(TB_SOCKET_TYPE_UDP, TB_IPADDR_FAMILY_IPV4);
tb_socket_ctrl(sock_fd, TB_SOCKET_CTRL_SET_BLOCK, tb_false);
tb_socket_ctrl(sock_fd, TB_SOCKET_CTRL_SET_SEND_BUFF_SIZE, 4 * 1024 * 1024);
tb_socket_ctrl(sock_fd, TB_SOCKET_CTRL_SET_RECV_BUFF_SIZE, 4 * 1024 * 1024);


tb_ipaddr_set(&addr, tb_null, 666, (tb_uint8_t)(TB_IPADDR_FAMILY_IPV4));

ret = tb_socket_bind(sock_fd, &addr);

if (ret != tb_true)
    return;

while(1){
    tb_byte_t buf[2048];
    ret = tb_socket_urecv(sock_fd, &peer_addr, buf, 2048);

    if (ret > 0){
        tb_printf("recv data len = %d\n", ret);
    }else {
        tb_printf("wait socket urecv \n");
        ret = tb_socket_wait(sock_fd, TB_SOCKET_EVENT_RECV, 10); **// 这里进程会退出** 
        tb_printf("wait socket urecv done\n");
    }
}

}

int main(int ac, char *av[])
{
tb_co_scheduler_ref_t scheduler;

if (!tb_init(tb_null, tb_null)) return -1;

(void)ac;
(void)av;
scheduler = tb_co_scheduler_init();
if (!scheduler){
    tb_printf("tb_co_scheduler_init failed !\n");
    return -1;
}

tb_coroutine_start(scheduler, test_run, NULL, 0);      
// run scheduler
tb_co_scheduler_loop(scheduler, tb_true);
// exit scheduler
tb_co_scheduler_exit(scheduler);
return 0;

}

//xmake.lua
add_requires("tbox", {configs = {debug = false, coroutine=true}})
add_requires("openssl")

-- project
set_project("testudp")

-- set project version
set_version("1.0.0", {build = "%Y%m%d%H%M"})
-- set warning all as error
set_warnings("all", "error")

set_languages("c99")
set_optimize("fastest")

-- disable some compiler errors
add_cxflags("-Wno-error=deprecated-declarations", "-fno-strict-aliasing", "-Wno-error=expansion-to-defined", "-Wall", "-Wextra", "-Werror", "-g")
add_mxflags("-Wno-error=deprecated-declarations", "-fno-strict-aliasing", "-Wno-error=expansion-to-defined")

-- add build modes
add_rules("mode.debug", "mode.release")

-- add target

target("test_udp")
-- deps project

-- make as a static library
set_kind("binary")

set_warnings("all", "error")

set_languages("c99", "c++11")
set_optimize("fastest")


-- add the common source files
add_files("*.c")

-- add depends packages
add_packages("tbox", "openssl")
@waruqi
Copy link
Member

waruqi commented Oct 18, 2021

直接空跑 recv 就跪? 需要 send 数据过去么。。

我这边测试 release/debug 下空跑 都 ok 的么。。没跪,一切正常

@waruqi
Copy link
Member

waruqi commented Oct 19, 2021

可复现的例子

test.zip

@waruqi
Copy link
Member

waruqi commented Oct 19, 2021

是 tbox 库开启 set_optimize("smallest") 编译在 windows 上会启用 lto 优化导致的问题,我暂时关了 lto 编译就可以了。。

你切到 add_requires("tbox master") 来使用

@walletiger
Copy link
Author

已经 OK

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants