ソケットを作成し、アドレスをバインドするソケット関数を使用するときは、接続して、サーバーを確立するための接続機能を使用することができます。
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
パラメータは、ソケット記述関数を作成するために数sockfdソケットは、サーバーのIPアドレスとポート番号を含む、リモートサーバのaddrのパラメータを指定ソケットアドレス、ソケットを返すあり; addrlenは、パラメータを指定ソケットアドレスの長さ。呼び出しが成功した後、それ以外の場合は、0を返します-1。
接続コールの接続機能を確立する前に、クライアント・アプリケーション・コードは、サーバー・プロセスは、ソケットアドレスを持って指定する必要があり、
クライアントは通常5000に自動的にポート1024の範囲の中から、自分のソケットアドレス、Linuxが指定されていません。未使用のポート番号は、クライアントに割り当てられ、その後、アドレスをソケットにポート番号とマシンのIPアドレスと組み合わせます。
クライアントが接続を確立するためのイニシアチブを取るために、関数connetを呼び出すと、接続が確立された後、またはエラーが、関数リターンを発生したときに、この関数は、3ウェイハンドシェイクプロセスのTCPプロトコルを開始します。接続プロセスは、エラー条件は以下のとおりであることがあります
- クライアントは、その承認SYNセグメントにエラーを持つ関数の戻りをTCPプロトコルを受信しない場合、エラーの種類はETIMEOUTです。SYNセグメントを送信した後、TCPプロトコルが失敗したすべてのエラーで送信失敗、関数リターンされた後、典型的には、それは、複数のSYNセグメントを送信します。
- リモートTCPプロトコルはエラーで直ちにRSTセグメント、関数リターンを返した場合は、エラータイプがECONNREFUSEDあります。リモートマシンがサーバプロセスのSYNセグメントの宛先ポート番号で指定された場合は、接続のための待ち時間がない場合、リモートマシンのTCPプロトコルは、このエラーにクライアントレポートをRSTセグメントを送信します。データセグメントRST、もはやエラーで直ちに、関数戻り送信されるSYNセグメントを受信した後にTCPプロトコルクライアント。
- もしルータ「宛先到達不能」ICMPメッセージタイプ、エラーの関数が返す、またはエラータイプEHOSTUNREACH ENETUNREACHの世代におけるクライアントSYNセグメントをもたらします。全ての送信、TCPプロトコルこのICMPメッセージを確認し、エラーの関数リターンを失敗した後、典型的には、このICMPメッセージを受信するメッセージを記録し、その後、SYNセグメントを送信した後、TCPプロトコルは、数回続けます。
関数を呼び出す場合は、接続が失敗し、それが機能近いとソケットディスクリプタをクローズする必要があり、connect関数を呼び出すために、ソケット記述子を再使用することはできません。
[実施例3]この関数は、接続使用して接続を確立する
ポート番号とIPアドレスを定義するポートとREMOTE_IPを使用してアプリケーションコードを、次にソケットと結合するソケットを作成するソケットとバインド関数を呼び出すし、そして最終的に接続する機能を使用しARGV [1]パラメータを接続するIPアドレスを指定しました。
アプリケーション・コードの例は以下の通り:
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fentl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#define PORT 80 //定义一个端口号
#define REMOTE_IP "59.175.132.70" //定义一个IP地址
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in addr; //定义 IPV4 套接字地址数据结构 addr
if(argc != 2)
{
printf("请输入正确的IP地址字符串。\n");
return 2;
}
if(sockd = socket(A_INET, SOCK_STRAMOY, 0))<0) //建立一个 socket
{
printf("创建套接字失败!\n");
return 1;
}
bzero(&addr,sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(argv[1]); //从argv[1]中获得目标的IP地址
if(connect(sockfd, (struct sockaddr *)(&addr), sizeof(struct sckaddr))<0)
{
printf("连接失败!\n");
return;
}
else
{
printf("连接成功!\n");
}
return 0;
}