0
我有一个相对简单的服务器,它应该打开服务器套接字并接受一个客户端套接字连接。Linux插座接受总是失败
if(!(STARTUP))
{
// CAN Socket öffnen
can_soc = initialize_CAN();
// TCP Socket öffnen
tcp_soc = initialize_TCP(strtol(argv[1],NULL,10));
STARTUP = 1;
}
// Jede empfangene CAN Botschaft auf TCP umleiten
while(!(EXIT_FLAG))
{
if(!(CLIENT_CONNECTED)) // Wenn keiner verbunden ist, wird gelistened
{
// LISTEN //
listen(tcp_soc,2);
std::cout << "Waiting for incoming TCP connection...\n";
c = sizeof(struct sockaddr_in);
tcp_client_soc = accept(tcp_soc, (struct sockaddr *)&client, (socklen_t*)&c);
if(tcp_client_soc < 0)
{
std::cout << "ERROR: accept failed\n";
EXIT_FLAG = 1;
return 0;
}
else
{
std::cout << "Connection from " << inet_ntoa(client.sin_addr) << " accepted!\n";
// --> NEUER CLIENT AKZEPTIERT //
CLIENT_CONNECTED = 1;
}
}
else // ansonsten: CAN auf TCP leiten
{
std::cout << "nop" << std::endl;
}
}
现在的问题是,该程序总是终止在“ERROR:接受失败”,这意味着接受总是提供-1与正在建立的无连接(O_NONBLOCK没有被设置)。
int initialize_TCP(int pPort)
{
int tcp_soc;
std::cout << "Creating TCP socket and binding to PORT: " << pPort << "... ";
tcp_soc = socket(AF_INET, SOCK_STREAM, 0);
if(tcp_soc == -1)
{
std::cout << "ERROR: Could not create socket!\n";
EXIT_FLAG = 1;
}
server.sin_addr.s_addr = INADDR_ANY; //do not specify IP (got a server here)
server.sin_family = AF_INET;
server.sin_port = htons(pPort);
// BIND //
if(bind(tcp_soc,(struct sockaddr *)&server, sizeof(server)) < 0)
{
std::cout << "Binding failed! Restarting network service ...\n";
system("/etc/init.d/networking restart"); //Restarted Network Servcie wenn Binding nicht geht
std::cout << "Binding again... ";
bind(tcp_soc,(struct sockaddr *)&server, sizeof(server));
std::cout << "OK\n";
}
std::cout << "OK\n";
}
那么问题在哪里?也许每次都有未知的连接?或者它是一个语法问题?
你在'while'循环中调用'listen()'。它应该在循环之外,或者在'bind()'成功之后的'initialize_TCP()'中更好。无论哪种方式,当accept()(或任何其他套接字函数)失败时,errno的值是什么?你应该输出到'cout'。另外,你也应该输出'strerror()'的结果。另外,请不要重新启动网络服务,这不是您的应用程序的责任。让用户去做。但是如果你重新启动,你可能不得不从头开始重新创建你的监听套接字。你没有检查重试的bind()失败。 –
您还需要应用相同的错误检查,以'插座(),听(),bind()的,...' – EJP
感谢@RemyLebeau,我实现了错误号,它表明88,“关于非插座式操作”,这意味着套接字没有正确初始化我假设? – rele92