私たちは、オブジェクト指向のスタイルでWebサーバーをプログラムする練習をしています。 WinSockets用のクラスを作成しました。主要な部分(acceptからsendまで)をループして接続を1つずつ処理したい(ちょうど起動する;マルチスレッドは後で実装される)。OOPソケットはaccept()を待機しません
問題:初めて接続が確立されましたが、サーバーは次の接続が受け入れられるまで待機しません。接続がありますが、その記述子がerrornr "No Error"というエラーをスローします。
メイン:
NetInterface *socket;
#ifdef __unix__
socket = new UnixSocket();
#elif __WIN32__ || _MSC_VER
socket = new WinSocket();
#else
printf("Ihr System wird nicht Unterstützt");
#endif
socket->socketInit(PORT);
printf("server: waiting for connections...\n");
while(1) { // main accept() loop
char *their_addr = socket->akzeptieren();
if(their_addr == NULL) {
continue;
}
printf("server: got connection from %s\n", s);
socket->empfangen();
cout << socket->getInPacket() << endl;
}
WinSocket
class WinSocket : virtual public NetInterface
{
private:
WSADATA wsaData;
int iResult;
SOCKET sockfd;
SOCKET new_fd;
struct addrinfo *servinfo;
struct addrinfo hints;
struct addrinfo *p;
int iSendResult;
string incoming;
int recvbuflen;
char s[INET6_ADDRSTRLEN];
struct sockaddr_storage their_addr; // connector's address information
socklen_t sin_size;
int rv;
public:
WinSocket();
int socketInit(const char *port);
char *akzeptieren();
void empfangen();
void senden(string s);
string getInPacket();
void *get_in_addr(struct sockaddr *sa);
};
[....]
char *WinSocket::akzeptieren(){
sin_size = sizeof(their_addr);
new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
if (new_fd == INVALID_SOCKET) {
perror("accept");
return NULL;
}
inet_ntop(their_addr.ss_family, get_in_addr((struct sockaddr *)&their_addr), s, sizeof s);
return s;
}