你好我有一个客户端套接字应用程序,同时连接超过5000服务器与linux中的tcpip,但当我打开套接字连接,几乎所有连接,检索错误操作正在进行中。
这里我的客户端套接字连接代码: 我怎么能同时做好数千个插座锥形? 对不起我的英语不好。 在这里我的代码:
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 :(得分: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]。