В вашем коде есть несколько ошибок, прежде чем вы достигнете bind()
:
int socketdesc = сокет (SOCK_STREAM, AF_INET, 0);
У вас есть первые 2 значения параметров в обратном направлении, вызов должен выглядеть следующим образом:
int socketdesc = socket(AF_INET, SOCK_STREAM, 0);
if (socketdesc == 0)
socket()
возвращает -1 при ошибке, а не 0.
if (setsockopt (socketdesc, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, & opt, sizeof (opt)))
setsockopt()
также возвращает -1 при ошибке.
Но что более важно, вы не можете объединить несколько опций сокетов в одном вызове, как это. Вам нужно звонить setsockopt()
для каждого варианта в отдельности:
if (setsockopt(socketdesc, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0)
...
if (setsockopt(socketdesc, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0)
...
С учетом сказанного попробуйте следующее:
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
int main()
{
int port = 5000;
std::cout << "Port: " << port << "\n";
int socketdesc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (socketdesc == -1)
{
std::cout << "Failed to create socket descriptor. " << strerror(errno) << "\n";
return 1;
}
int opt = 1;
if (setsockopt(socketdesc, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0)
{
std::cout << "Failed to set SO_REUSEADDR option. " << strerror(errno) << "\n";
return 1;
}
if (setsockopt(socketdesc, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0)
{
std::cout << "Failed to set SO_REUSEPORT option. " << strerror(errno) << "\n";
return 1;
}
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(port);
if (bind(socketdesc, (struct sockaddr *)&address, sizeof(address)) < 0)
{
std::cout << "Failed to bind socket! " << strerror(errno) << "\n";
return 1;
}
std::cout << "Listening with protocol TCP on port" << port << ".\n";
if (listen(socketdesc, 3) < 0)
{
std::cout << "Failed to listen on socket! " << strerror(errno) << "\n";
return 1;
}
if (shutdown(socketdesc, SHUT_RDWR) < 0)
{
std::cout << "Failed to close socket! " << strerror(errno) << "\n";
return 1;
}
close(socketdesc);
std::cout << "TCP test succeeeded.\n";
return 0;
}