LinuxベースのC++のネットワークプログラミング
11048 ワード
ソケットの基本概念
通信タイプ:ソケットがデータをどのように転送し、処理するかを制御し、データをパケット形式で転送する
ネームスペース:ソケットアドレスフォーマットの指定
プロトコル:データの転送方法の決定
ソケット関数
ソケット()関数:ソケットの作成
int socket(int domain,int type,int protocol);
int close(int fd);
int connect(int sockfd,const struct sockaddr* addr,socklen_t addrlen);
ssize_t send(int sockfd,const void* buf,size_t len,int flags);
bind()関数:バインドソケットとそのサーバアドレス
int bind(int sockfd,const struct sockaddr* addr,socklen_t addrlen);
int listen(int sockfd,int backlog);
accept()関数:接続を受け入れ、その接続に新しいソケットを作成します.
int accept(int sockfd,struct sockaddr* addr,socklen_t addrlen);
ローカルソケットの例:サーバー側
#include
#include
#include
#include
#include
#include
#include
// , “quit”
// true, false,
bool Serve(int client_socket)
{
while (true) {
int length;
char* msg;
// , 0
if(read(client_socket,&length,sizeof(length)) == 0)
return true;
msg = new char[length];
read(client_socket,msg,length);
std::cout<std::endl;
if(!strcmp(msg,"quit")) {delete[] msg,msg = NULL;return false;}
else delete[] msg, msg = NULL;
}
}
int main(int argc,char* const argv[])
{
const char* const socket_name = argv[1];
ing socket_fd;
struct sockaddr_un name;
bool serving = true;
//
socket_fd = socket(PF_LOCAL,SOCK_STREAM,0);
//
name.sun_family = AF_LOCAL;
strcpy(name.sun_path,socket_name);
//
bind(socket_fd,(struct sockaddr*)&name,SUN_LEN(&name));
//
listen(socket_fd,5);
// , “quit”
while(serving)
{
struct sockaddr_un client_name;
socklen_t client_name_len;
int client_socket_fd;
//
client_socket_fd = accept(socket_fd,(struct sockaddr*)&client_name,&client_name_len);
serving = Serve(client_socket_fd); //
close(socket_fd);//
}
close(socket_fd);
unlink(socket_name); //
return 0;
}
ローカルソケットの例、クライアント
#include
#include
#include
#include
#include
#include
#include
void SendMsg(int socket_fd,const char* msg)
{
int length = strlen(msg) + 1;
write(socket_fd,&length,sizeof(length));
write(socket_fd,msg,length);
}
int main(int argc, char const *argv[]) {
const char* const socket_name = argv[1];
const char* const msg = argv[2];
int socket_fd;
struct sockaddr_un name;
//
socket_fd = socket(PF_LOCAL,SOCK_STREAM,0);
//
name.sun_family = AF_LOCAL;
strcpy(name.sun_path,socket_name);
//
connect(socket_fd,(struct sockaddr*)&name,SUN_LEN(&name));
//
SendMsg(socket_fd,msg);
close(socket_fd);
return 0;
}
ローカルソケットの例:実行
プログラムテスト実行
./server/tmp/socket;
./serverはサーバ側プログラム名、/tmp/socketは本サーバ起動後のソケットファイル名./client/tmp/socket"Hello World!"
;Clientはクライアントプログラム名./client/tmp/socket"quit"
#include
#include
#include
#include
#include
#include
#include
#include
// Web
void GetHomepage(int socket_fd)
{
char buffer[8192];
sprintf(buffer,"GET /
");
write(socket_fd,buffer,strlen(buffer));
while(true){
ssize_t count = read(socket_fd,buffer,8192);
if(count == 0) return;
fwrite(buffer,sizeof(char),count,stdout);
}
}
int main(int argc, char const *argv[])
{
int socket_fd;
struct sockaddr_in name;
struct hostent* hostinfo;
socket_fd = socket(PF_INET,SOCK_STREAM,0);
name.sin_family = AF_INET;
hostinfo = gethostbname(argv[1]);
if(hostinfo == NULL) return 1;
else name.sin_addr = *((struct in_addr*)hostinfo ->h_addr);
name.sin_port = htons(80);
if(connect(socket_fd,(struct in_addr*)&name,sizeof(struct sockaddr_in)) == -1) {
perror("Failure to connect the server.");
return 2;
}
GetHomepage(socket_fd);
return 0;
}
“
“`