個人的な練習として、C++ で Linux 用のさらに別のソケット ライブラリに取り組んでいます。これが私のコードです:
#ifndef SOCKET_H
#define SOCKET_H
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
/**
* Creates a struct to hold all the necessary information to create a socket.<br/>
* Typically, you should not need to call this yourself, as it is done when you call listen() or dial()
* @param host The hostname or IP address to connect to.
* @param service The service on that machine (e.g "http" or "80")
* @param sock The type of socket ("tcp" or "udp")
* @return A addrinfo struct with all the required information to create a connection.
*/
addrinfo setup(const char *host,const char *service,const char *sock) {
struct addrinfo hints;
struct addrinfo *serv;
cout << "2.call to setup()\n";
//cout << "3.setup() returns here.\n";
//return *serv;
int status=0;
/*struct addrinfo hints;
struct addrinfo *serv;*/
memset(&hints,0,sizeof hints);
hints.ai_family=AF_UNSPEC;
if (sock=="tcp") {
hints.ai_socktype=SOCK_STREAM;
} else if (sock=="udp") {
hints.ai_socktype=SOCK_DGRAM;
} else {
fprintf(stderr,"[!] xsockets: error: unknown socket type %s\n",sock);
exit(2);
}
hints.ai_flags=AI_PASSIVE;
if ((status=getaddrinfo(host,service,&hints,&serv))!=0) {
fprintf(stderr, "[!] xsockets: error: getaddrinfo error: %s\n", gai_strerror(status));
exit(1);
}
cout << "3.setup() returns here.\n";
return *serv;
}
/**
* Listens on a portand returns a scoket file descriptor.
* @param service The service on this machine (e.g "http" or "80")
* @param sock The type of socket ("tcp" or "udp")
* @return A socket filde descriptor.
*/
int listen(const char *service,const char *sock) {
cout << "1.call to listen()\n";
struct addrinfo *serv;
*serv=setup(NULL,service,sock);
cout << "4.is this ever called?";
int sockfd=socket(serv->ai_family,serv->ai_socktype,serv->ai_protocol);
int status=bind(sockfd,serv->ai_addr,serv->ai_addrlen);
if (status!=0) {
fprintf(stderr,"[!] xsockets: error: bind error: %s\n",gai_strerror(status));
exit(3);
}
cout << "5.listen() returns here.";
return sockfd;
}
#endif
これを実行すると、#3「setup() がここに戻る」までは到達しますが、#4「これは呼び出されたことがありますか?」には到達しません。はるかに少ない#5「listen()がここに戻る」
誰が何がうまくいかなかったのか教えてもらえますか。
私はUbuntu Linuxを使用しており、これをルート権限で実行しています。g++
コマンドでコンパイルしました。
ここに私が得ているものがあります: