ソケット機能
int socket(int domain,int type,int protocol);
ドメインはプロトコルクラスターであり、値は次のとおりです
- AF_INET:Ipv4プロトコルを使用する
- AF_INET6:Ipv6プロトコルを使用する
- AF_UNIX:ローカル通信。通常、クライアントとサーバーが同じマシン上にある場合を指します。
- AF_NETLINK:カーネルとユーザーモード間の通信
typeはソケットのタイプを指し、値は次のとおりです
- SOCK_STREAM:データストリーム通信、つまりTCP通信が使用されます。
- SOCK_DGRAM:データパケット通信、つまりUDP通信が使用されます。
プロトコルは通常0です
ヘッドファイル#include<sys/types.h> #include<sys/socket.h>
戻り値:
関数が成功すると、ソケット記述子である正の整数が返されます。関数が失敗すると、-1が返されます。
#include<sys/types.h> //基本系统数据类型
#include<sys/socket.h>
#include<iostream>
using namespace std;
int main()
{
int sockfd;
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
cout<<"create socket error"<<endl;
}
cout<<sockfd<<endl;
return 0;
}
ビン関数
bin関数はバインディングアドレス空間関数です。ソケット構造にはデフォルトのIPアドレスとデフォルトのポート番号がありますが、サーバープログラムはバインド関数を呼び出して独自のIPアドレス情報と特定のポート番号をバインドする必要があります。
int bind(int sockfd,const struct sockaddr* addr,socklen_t addrlen)
- sockfd:バインドするソケット記述子を識別します
- addr:はsockadddr構造であり、Ipv4、Ipv6、Unixの3つの形式があります。
- addrlen:addrのバッファー長を指定します
//Ipv4地址域
struct sockaddr_in{
sa_family_t sin_family; //地址簇AF_INET
in_port_t sin_port; //端口
struct in_addr sin_addr; //地址
};
struct in_addr{
uint32_t s_addr; //网络字节序
};
//Ipv6地址域
struct sockaddr_in6{
sa_family_t sin6_family; //AF_INET6
in_port_t sin6_port; //端口
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id;
}
struct in6_addr{
unsigned char s6_addr[16];
};
bin関数の使用
#include<sys/types.h> //基本系统数据类型
#include<sys/socket.h>
#include<iostream>
using namespace std;
int main()
{
struct sockaddr_in sockaddr;
int port = 3000;
int socketfd;
memset(&sockaddr,0,sizeof(sockaddr));
sockaddr.sin_family = AF_INET;
sockaddr.sin_addr.s_addr = htonl(127.0.0.1);
sockaddr.sin_port = htons(port);
socketfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1)
{
cout<<"socket create error"<<endl;
return -1;
}
return 0;
}
リッスン機能
主にサーバー側の監視に使用されます。
int listen(int pid,int backlog);
pid:
バックログを監視するためのソケット記述子:接続要求の接続の最大数を表します
機能を受け入れる
サーバープログラムが、リスニング状態のストリーミングソケットのクライアント接続要求キューから最初のクライアント要求を取得し、クライアントと通信するための新しいソケットを作成するために使用します。
int accetp(int pid,struct sockaddr* addr,socklen_t *addrlen)
- pid:リスニング状態のストリーミングソケット記述子です
- addr:IPとポート番号を含むクライアントのプロトコルアドレスを取得します
- addrlen:クライアントアドレス構造のサイズ。
struct sockaddr_in NewSocket;
int addrlen;
addrlen = sizeof(NewSocket);
int NewServerSocket = accept(ListenSocket,(struct sockaddr*)&NewSocket,&addrlen);
if(NewServerSocket == -1)
{
cout<<"accept socket error"<<endl;
}
接続機能
クライアントがサーバーに接続するために使用します
int connect(int pid,const struct sockaddr* name,socklen_t namelen)
- pid:まだ接続されていないソケット記述子
- 名前:サーバーソケットのアドレス構造へのポインタ
- namelen:ソケットアドレス構造のサイズ
関数が正常に実行された場合は0を返し、それ以外の場合は-1を返します。
書き込み関数
クライアントとサーバーの両方が書き込み機能を使用して、TCP接続のもう一方の端にデータを送信できます。
int write(int pid,const char* buf,int len)
- pid:送信者のソケット
- buf:バッファを送信
- len:バッファのサイズ
戻り値:実際に送信されたバイト数を返します
読み取り機能
クライアントとサーバーの両方が、読み取り機能を使用してデータを受信できます。
int read(int pid,char *buf,int len)
- pid:ソケット記述子
- buf:バッファ、読み取られたデータを格納するために使用されます
- len:バッファのサイズ
戻り値:実際に読み取られたバイト数を返します。接続が閉じている場合は、0を返します。
送信機能
関数は書き込み関数に似ています
size_t send(int pid,const char* buf,size_t len,int flag)
最初の3つのパラメータの意味は書き込みに似ており、フラグは送信制御フラグです。
- 0:書き込みと同様に、通常を意味します
- MSG_DONTROUTE:宛先ホストが直接接続されたローカルネットワーク上にあることをカーネルに通知します
- MSG_DONTWAIT:単一のI \ O操作を非ブロッキングモードに設定します
戻り値:実際に送信されたバイト数を返します
recv関数
この機能は読み取り機能に似ています
ssize_t recv(int sockfd,void *buf,size_t len,ing flag)
。最初の3つのパラメータの意味は読み取りに似ており、フラグは送信制御フラグです。
- 0:正常を示し、読み取りと同様
- MSG_DONTWAIT:単一のI \ O操作を非ブロッキングモードに設定します
- MSG_OOB:読み取りデータは一般データではなく帯域外データです
戻り値:実際に読み取られたバイト数を返します。接続が閉じている場合は、0を返します。
閉じる
ソケットを閉じる
int close(int sockfd)
成功した場合は0を返し、失敗した場合は-1を返します。