C++ 套接字接受块 cout
c++ socket accept blocks cout
总的来说,我对C++/C很陌生,所以如果这个问题看起来有点愚蠢,请原谅我,但我真的被困在这里了。
我正在尝试做的是一个简单的 tcp 服务器,让用户有机会接受/拒绝传入连接。我有一个名为waitingForConnection((的函数,其中包含主循环。在套接字成功绑定并标记为被动后,在 main 函数中调用它。
我所期望的是,在客户端连接到服务器后,函数handleConnection((被调用,导致主循环等到函数执行,然后才连续。 但实际上似乎发生的事情是,在handleConnection(( 完全执行之前,主循环继续到下一个accept((调用,该调用阻塞了线程。仅当客户端第二次连接并且线程再次唤醒时,测试输出"done"才会变得可见。
对我来说,代码似乎是完全无序执行的,我认为这是不可能的,因为整个代码应该在单个线程中执行。
首次连接尝试后的控制台输出("n"是用户输入(:
"Accept connection ? (y/n)"n
第二次连接尝试后的控制台输出:
"Accept connection ? (y/n)"n
"doneAccept connection ? (y/n)"
请注意,我不是在使用select((或类似的东西寻找任何解决方法,我只是想了解为什么代码会这样做,以及如何通过更改结构来修复它。
int soc = socket(AF_INET, SOCK_STREAM, 0);
void handleConnection(int connectionSoc, sockaddr_in client){
string choice;
cout<<"Accept connection ? (y/n)";
cin>>choice;
if(choice=="y"||choice == "Y"){
//do something here
}else{
close(connectionSoc);
}
cout<<"done";
}
void waitingForConnection(){
while(running){
sockaddr_in clientAddress;
socklen_t length;
length = sizeof(clientAddress);
int soc1 = accept(soc,(struct sockaddr*)&clientAddress, &length);
if(soc1<0){
statusOutput("Connection failed");
}else{
handleConnection(soc1, clientAddress);
}
}
}
问题是输出到std::cout
是缓冲的,在刷新之前你根本看不到它。当std::cin
自动刷新std::cout
时,您会在下一个输入上获得输出。将输出更改为:
std::cout << "done" << std::endl;
你会得到预期的行为。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- C++套接字客户端到 Python 服务器未创建连接
- 在不知道套接字的情况下关闭网络连接
- C++套接字对不读/写父/子
- 非更新套接字消息
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- C++ 套接字接受块 cout
- 将 printf 和 cout 重定向到套接字