#include "ccnet.h"
の#include <sysの/ TIME.H>
書式#include <sysの/ timeb.h>
書式#include <sysの/ stat.h>
の#include <sysの/ param.h>の中
の#include <sysの/タイプ。 H>
の#include <SYS / shm.h>
の#includeは<sys / sem.h>
の#include <SYS / ipc.h>
の#includeは<sys / wait.h>
の#include <signal.hに>
する#include <pスレッド。 H>
の#include <signal.hに>
する#include <ERRNO.H>
の#include <limits.hに>
する#include <fcntl.h>
//サーバーへの接続
静的int型
接続(int型の数sockfd、constのsockaddr構造体の*のserv_addr、のsocklen_t addrlenは)
{
(serv_addr = NULLを!)主張。
接続返す(数sockfd、serv_addr、addrlenは);
}
//サーバーをシャットダウン
int型を閉じる(int型FD)
{
(FD)近い返します。
}
//サーバーへの接続
//パラメータ:IP、ポート、タイムアウト
int型 CCConnectO(のconstのchar *ホスト、int型ポート、int型*タイムアウト、CONST文字*名)
{
チャーBUF [1024]。
FD_SET RSET、WSET。
構造体たhostent彼、* P;
構造体のsockaddr_in罪;
socklen_t LEN = 0。
INT靴下= -1、RET = 0、ERR = 0、フラグ= 0、= 1に。
構造体体timevalトン。
主張(ホスト= NULLを!)。
IF(*タイムアウト<0){
*タイムアウト= 0。
}
INT old_timeout = *タイムアウト。
//無効なサーバ
IF(ホスト[0] == 0 ||ポート== 0){
-1を返します。
}
IF((靴下=ソケット(PF_INET、SOCK_STREAM、0))<0){
LOG_WARN( "%S(%Sへの接続中にソケットを作成できません:%のD)"、名前、ホスト、ポート)。
-1を返します。
}
BZERO(&罪、はsizeof(罪));
sin.sin_addr.s_addr =のinet_addr(ホスト)。
((sin.sin_addr.s_addr)== INADDR_NONE)場合は{/ *ホストがない数値とドットIPアドレス* /
RET = gethostbyname_r(ホスト、および彼、bufが、はsizeof(BUF)、&P、&ERR)。
IF(RET <0){
LOG_WARN( "%S(%Sへの接続中のホスト名を解決できません:%のD)"、名前、ホスト、ポート)。
クローズ(靴下)
-1を返します。
}
のmemcpy(&sin.sin_addr.s_addr、he.h_addr、はsizeof(sin.sin_addr.s_addr))。
}
sin.sin_family = AF_INET。
sin.sin_port = htons(ポート)。
フラグ=のfcntl(靴下、F_GETFL、0);
fcntlの(靴下、F_SETFL、旗| O_NONBLOCK);
setsockopt(靴下、IPPROTO_TCP、TCP_NODELAY、&上で、はsizeof()で)。
RET =接続(靴下、(sockaddr構造体の*)&罪、はsizeof(罪));
(RET == 0){場合
のfcntl(靴下、F_SETFL、フラグ)。
LOG_INFO( "%sの(%sの接続:%d)はOK"、名前、ホスト、ポート)。
靴下を返します。
}他{
場合(!= errnoにEINPROGRESSは){/ * * /ホストに接続できない
LOG_WARN( "フェイル%S(%Sへの接続中:%のD)"、名前、ホスト、ポート)。
クローズ(靴下)
-1を返します。
}
FD_ZERO(&RSET)。
FD_SET(靴下、&RSET)。
WSET = RSET。
t.tv_sec = *タイムアウト/ 1000000、t.tv_usec = *タイムアウト%1000000;
RET =(靴下+ 1、&RSET、&WSET、NULL、&T)を選択します。
IF(t.tv_sec * 1000000 + t.tv_usec <10)
t.tv_sec = 0、t.tv_usec = 0。
*タイムアウト= t.tv_sec * 1000000 + t.tv_usec。
IF(RET == 0){
LOG_WARN( "タイムアウト(%dの米国)%S(%Sへの接続中:%D)"、old_timeout、名前、ホスト、ポート)。
クローズ(靴下)
-1を返します。
}
IF(FD_ISSET(靴下、およびRSET)|| FD_ISSET(靴下、&WSET)){
lenは=のはsizeof(ERR)。
RET =のgetsockoptは(靴下、SOL_SOCKET、SO_ERROR、&ERR、&LEN)。
IF(RET <0){
IF(ERR){
エラー番号= ERR。
}
LOG_WARN( "%S(%Sへの接続中に失敗GETSOCKOPTた:%d)"、名前、ホスト、ポート)。
クローズ(靴下)
-1を返します。
}
(ERR){場合
はerrno = ERR。
LOG_WARN( "%S(%sに接続中に失敗sockselectた:%d)"、名前、ホスト、ポート)。
クローズ(靴下)
-1を返します。
}
のfcntl(靴下、F_SETFL、フラグ)。
LOG_INFO( "%sの(%sの接続:%d)はOK"、名前、ホスト、ポート)。
靴下を返します。
}他{
LOG_WARN( "%S(%sに接続中に失敗選択した:%d)"、名前、ホスト、ポート)。
クローズ(靴下)
-1を返します。
}
}
-1を返します。
}