サーバーとクライアントを作成していて、「bind: Socket operation on non-socket」というメッセージが表示され続けます。
私はこれについて調べました.別のアプリケーションで実行される他のコードがあり、このバグを見つけるために8時間使い果たしました.
コードは次のとおりです。
void TCPSocket::buildTCPSocket(int port)
{
initializeSocket1();
getSocket();
bindSocket();
listenToSocket();
acceptSocket();
// now you can send() and recv() with the
// connected client via socket connectedTCPSocket
}
void TCPSocket::getSocket()
{
// Get an internet domain socket AF_INET
if(socket1 = socket(AF_INET, SOCK_STREAM,0) == -1)
{
perror("socket");
exit(1);
}
}
void TCPSocket::bindSocket()
{
// Bind to a port on the host
int myAddressSize = sizeof(myAddress);
int bindReturnValue = bind(socket1, (struct sockaddr *) &myAddress, AddressSize);
if (bindReturnValue == -1)
{
perror("bind"); // <== Error message generated here
exit(1);
}
printf("Socket for TCP bound to port %d\n", port);
}
また、これに先立って、この関数でメモリ ブロックを memset します。
void TCPSocket::initializeSocket1()
{
// Fill tcpSocket struct with 0's
memset(&myAddress, '\0', sizeof(myAddress));
myAddress.sin_family = AF_INET;
myAddress.sin_addr.s_addr = INADDR_ANY;
// Conver PORT to big-endian if necessary
myAddress.sin_port = htons(this->port);
}
変数は、クラスのヘッダー ファイルで宣言されます。
public:
struct sockaddr_in myAddress, clientAddress;
void buildTCPSocket(int newPort);
private:
int port;
int socket1, socket2;
socklen_t clientAddressLength;
-- コードを編集して、もう少し明確にする必要があります。socket1 は getSocket() で初期化されます。
多くの人が if のかっこを見逃しているところを見てきましたが、myAddressSize と bindReturnValue を宣言することでそのエラーを解消したと思います。
どんな入力でも大歓迎です。
ありがとう、テッド・S
わかりました、問題は解決しました。もちろん、問題はあなたが探している場所ではありません。これが修正されたコードです。問題は、socket() の呼び出しで括弧のセットが欠落していたことにありました。
void TCPSocket::getSocket()
{
// Get an internet domain socket AF_INET
if((socket1 = socket(AF_INET, SOCK_STREAM,0)) == -1)
{
perror("socket");
exit(1);
}
}
再度、感謝します!