0

こんにちは、Linuxでtcpipを使用して5000を超えるサーバーに同時に接続するクライアントソケットアプリケーションがありますが、ソケット接続を開くと、ほとんどすべての接続で、現在進行中のエラー操作が取得されます。

ここに私のクライアントソケット接続コードがあります:同時に何千もの同時ソケット接続を行うにはどうすればよいですか??? 私の英語でごめんなさい。ここに私のコード:

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

4

1 に答える 1

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] に設定します。

于 2013-01-09T03:35:37.653 に答える