ネットワークプログラミングは、最初のファイルを選択します

#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を返します。
}

おすすめ

転載: www.cnblogs.com/cyblogs/p/11295682.html