linuxサーバプログラミング入門(一)最も簡単なlinuxサービスを実現する
5287 ワード
最も進んでlinuxのネットのプログラミングを学んで、いくつかノートをして、自分が忘れて印象を深めることを防止します.
1.リスニングソケットの作成
コードは次のとおりです.
2.struct sockaddrを定義するinとローカルのIP portバインド
コードは次のとおりです.
3.lfdとserverバインド
4.傍受の設定
5.接続要求の待機および受信
6.接続成功後にクライアント情報を印刷する
7.ループ受入情報
8.サービス側ソケットを閉じる
完全なコードは次のとおりです.
クライアントは次のドキュメントを書きます.
1.リスニングソケットの作成
/*
1.
int socket(int domain, int type, int protocol);
AF_INET, ipv4
socket 。 , TCP(SOCK_STREAM) UDP(SOCK_DGRAM)
TCP SOCK_STREAM
, 。 。 0
: -1。
*/
コードは次のとおりです.
int lfd = socket(AF_INET, SOCK_STREAM, 0);
if(lfd == -1)
{
perror("socket error");
exit(1);
}
2.struct sockaddrを定義するinとローカルのIP portバインド
コードは次のとおりです.
struct sockaddr_in server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET; // - ipv4
server.sin_port = htons(8888);//htons , htonl htons short htonl long
server.sin_addr.s_addr = htonl(INADDR_ANY); //INADDR_ANY 0.0.0.0
3.lfdとserverバインド
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//
// (struct sockaddr*)
// server , struct sockaddr_in
// 0 -1
int ret = bind(lfd, (struct sockaddr*)&server, sizeof(server));
if(ret == -1)
{
perror("bind error");
exit(1);
}
4.傍受の設定
//int listen(int sockfd, int backlog);
//sockfd
//backlog
// 0 -1
ret = listen(lfd, 20);
if(ret == -1)
{
perror("listen error");
exit(1);
}
5.接続要求の待機および受信
//int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//sockfd: , listen() 。
//addr:( ) , , 。Addr 。
//addrlen:( ) , , addr , addr 。
// 0 -1
struct sockaddr_in client;
socklen_t len = sizeof(client);
int cfd = accept(lfd, (struct sockaddr*)&client, &len); //cfd
if(cfd == -1)
{
perror("accept error");
exit(1);
}
6.接続成功後にクライアント情報を印刷する
//const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
//
//af AF_INET
//src ip
// dst
//size dst
//uint16_t ntohs(uint16_t netshort);
// netshort
//
printf(" accept successful !!!
");
char ipbuf[64] = {0};
printf("client IP: %s, port: %d
",
inet_ntop(AF_INET, &client.sin_addr.s_addr, ipbuf, sizeof(ipbuf)),ntohs(client.sin_port));
7.ループ受入情報
while(1)
{
//
char buf[1024] = {0};
int len = read(cfd, buf, sizeof(buf)); // read cfd
if(len == -1) // -1
{
perror("read error");
exit(1);
}
else if(len == 0) // 0
{
printf("
");
close(cfd);
break;
}
else //
{
printf("recv buf: %s
", buf);
// - -
for(int i=0; i
8.サービス側ソケットを閉じる
close(lfd);
完全なコードは次のとおりです.
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, const char* argv[])
{
//
int lfd = socket(AF_INET, SOCK_STREAM, 0);
if(lfd == -1)
{
perror("socket error");
exit(1);
}
// lfd IP port
struct sockaddr_in server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET; // - ipv4
server.sin_port = htons(8888);
server.sin_addr.s_addr = htonl(INADDR_ANY);
int ret = bind(lfd, (struct sockaddr*)&server, sizeof(server));
if(ret == -1)
{
perror("bind error");
exit(1);
}
//
ret = listen(lfd, 20);
if(ret == -1)
{
perror("listen error");
exit(1);
}
//
struct sockaddr_in client;
socklen_t len = sizeof(client);
int cfd = accept(lfd, (struct sockaddr*)&client, &len);
if(cfd == -1)
{
perror("accept error");
exit(1);
}
printf(" accept successful !!!
");
char ipbuf[64] = {0};
printf("client IP: %s, port: %d
",
inet_ntop(AF_INET, &client.sin_addr.s_addr, ipbuf, sizeof(ipbuf)),
ntohs(client.sin_port));
//
while(1)
{
//
char buf[1024] = {0};
int len = read(cfd, buf, sizeof(buf));
if(len == -1)
{
perror("read error");
exit(1);
}
else if(len == 0)
{
printf("
");
close(cfd);
break;
}
else
{
printf("recv buf: %s
", buf);
// - -
for(int i=0; i
クライアントは次のドキュメントを書きます.