linux — клиентский сокет c ++ одновременно соединение

привет, у меня есть клиентское приложение сокета, которое подключается одновременно, с более чем 5000 серверов с tcpip в Linux, но когда я открываю соединение с сокетом, почти все соединения, получить ошибку Операция сейчас выполняется.

Вот мой код подключения сокета клиента:
Как я могу делать добрые тысячи одновременно сокет conecction ???
Извините за мой английский.
вот мой код:

struct sockaddr_in echoserver;
struct sockaddr_in sa_loc;
char aport[64];
int optval = 1;
int sock;

memset(&echoserver, 0, sizeof (echoserver));
echoserver.sin_family = AF_INET;
echoserver.sin_addr.s_addr = inet_addr(server.c_str());
echoserver.sin_port = htons(0);

SOCKET = socket(AF_INET, SOCK_STREAM, 0);
if (SOCKET == -1)
{
iLastError = errno;
strLastError = "Create socket Error : "+string(strerror(errno));
connected = false;
return connected;
}

struct timeval timeouts, timeoutr;
memset(&timeouts, 0, sizeof(timeouts)); // zero timeout struct before use
timeouts.tv_sec = SendTimeOut/1000;
timeouts.tv_usec = 0;
memset(&timeoutr, 0, sizeof(timeoutr)); // zero timeout struct before use
timeoutr.tv_sec = ReceiveTimeOut/1000;
timeoutr.tv_usec = 0;
int sockopt = setsockopt(SOCKET, SOL_SOCKET, SO_SNDTIMEO, &timeouts, sizeof(timeouts));
if (sockopt == -1)
{
printf("%s%s","Set socket Option error : ",strerror(errno));
iLastError = errno;
strLastError = "setsockopt Error : "+string(strerror(errno));
}
sockopt = setsockopt(SOCKET, SOL_SOCKET, SO_RCVTIMEO, &timeoutr, sizeof(timeoutr)); //
if (sockopt == -1)
{
printf("%s%s","Set socket Option error : ",strerror(errno));
iLastError = errno;
strLastError = "setsockopt Error : "+string(strerror(errno));
}

memset(&sa_loc, 0, sizeof(struct sockaddr_in));
sa_loc.sin_family = AF_INET;
sa_loc.sin_port = htons(0);  //8000
sa_loc.sin_addr.s_addr = inet_addr(SourceIP.c_str());
int bindid = bind(SOCKET, (struct sockaddr *)&sa_loc, sizeof(sa_loc));
if (bindid !=0)
{
iLastError = errno;
strLastError = "Bind Error : "+string(strerror(errno));
}

int conn = connect(SOCKET, (struct sockaddr *) &echoserver, sizeof(echoserver));

if (conn == -1)
{
strLastError = "Connect Error : "+string(strerror(errno));
connected = false;
}
else {
connected = true;
}

return connected;

WPP

0

Решение

если ваша переменная SendTimeOut является < 1000, тогда ваш тайм-аут для recv будет равен 0, и я не уверен, что это то же самое, что и установка O_NONBLOCK, но если это так, то это звучит так, как будто это нормальный процесс, и вы должны зацикливаться, пока он не завершится (или вы не получите EISCONN) или не с другим кодом ошибки. Если это подразумевается, вы, вероятно, должны просто установить O_NONBLOCK явно.

http://linux.die.net/man/3/connect

EINPROGRESS
O_NONBLOCK установлен для дескриптора файла для сокета, и соединение не может быть немедленно установлено; соединение должно быть установлено асинхронно.

Если соединение не может быть установлено немедленно, и для дескриптора файла для сокета установлено O_NONBLOCK, connect () должен завершиться сбоем и установить errno на [EINPROGRESS], но запрос на соединение не должен быть прерван, и соединение должно быть установлено асинхронно. Последующие вызовы connect () для того же сокета до того, как соединение будет установлено, завершатся неудачно и для errno будет установлено значение [EALREADY].

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]