Pie*_*ter 6 c c++ sockets networking
我有一个聊天应用程序,它有一个单独的线程来监听传入的消息.
while (main thread not calling for receiver to quit) {
string message = tcpCon.tcpReceive(); // Relies on the recv() function
processIncomingMessage(message);
}
Run Code Online (Sandbox Code Playgroud)
这种工作方式有一个大问题.大多数情况下,循环将被阻塞,recv()因此接收器线程将不会退出.在没有强制线程终止几秒钟的情况下解决此问题的正确方法是什么?
fiz*_*zer 11
关闭插座,shutdown()关闭所有接收器.
这会在我的系统上输出'recv return 0',表示接收器看到有序关机.评论shutdown()并观看它永远挂起.
从长远来看,OP应该修复设计,使用select或包含协议中的显式退出消息.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
/* Free on my system. YMMV */
int port = 7777;
int cd;
void *f(void *arg)
{
/* Hack: proper code would synchronize here */
sleep(1);
/* This works: */
shutdown(cd, SHUT_RDWR);
close(cd);
return 0;
}
int main(void)
{
/* Create a fake server which sends nothing */
int sd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in sa = { 0 };
const int on = 1;
char buf;
pthread_t thread;
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = htonl(INADDR_ANY);
sa.sin_port = htons(port);
setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof on);
/* Other error reporting omitted for clarity */
if (bind(sd, (const struct sockaddr*)&sa, sizeof sa) < 0) {
perror("bind");
return EXIT_FAILURE;
}
/* Create a client */
listen(sd, 1);
cd = socket(AF_INET, SOCK_STREAM, 0);
connect(cd, (const struct sockaddr*)&sa, sizeof sa);
accept(sd, 0, 0);
/* Try to close socket on another thread */
pthread_create(&thread, 0, f, 0);
printf("recv returned %d\n", recv(cd, &buf, 1, 0));
pthread_join(thread, 0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用 select() 等待传入数据并避免在 receive() 中阻塞。select() 也会阻塞,但您可以让它在设定的时间间隔后超时,以便 while 循环可以继续并检查从主线程退出的信号:
while (main thread not calling for receiver to quit) {
if (tcpCon.hasData(500)) { // Relies on select() to determine that data is
// available; times out after 500 milliseconds
string message = tcpCon.tcpReceive(); // Relies on the recv() function
processIncomingMessage(message);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7966 次 |
| 最近记录: |