2013-01-09 40 views
0

你好,我有一個客戶端套接字應用程序,在Linux中TCPIP連接在同一時間,有超過5000的服務器,但是當我打開套接字連接,幾乎所有的連接,現在檢索錯誤操作進行中。C++客戶端套接字同時連接

這裏我的客戶端套接字連接代碼: 我怎樣才能做一個好幾千的同時同時插座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設置爲套接字的文件描述符,連接()失敗,將errno設置爲[EINPROGRESS],但連接請求不得中止,並且連接應該異步建立。在建立連接之前,對連接()的相同套接字的後續調用將失敗並將errno設置爲[EALREADY]。

+0

我可以改變什麼來解決這個代碼?????你可以幫我嗎??? – wpp