2016-05-03 8 views
0

私はC++でネットワークプログラミングを自分自身で教えようとしていますが、私は解決できないようないくつかの中核的な問題に取り組んでいます。基本的なサーバー/クライアントコードの問題

私は同じVSプロジェクトにある2つのプログラム、つまりクライアントとサーバーを持っています。彼らは情報を交換しません、彼らは単に接続し、接続が確立されたら教えてください。ここでは、クライアントファイル -

SERVER.CPP

#include "stdafx.h" 

using namespace std; 

int main() 
{ 
    //setting up WSA 
    WSADATA wsaData; 
    int WSAcheck = WSAStartup(MAKEWORD(2, 2), &wsaData); 

    //checking WSA 
    if (WSAcheck != 0) 
    { 
     printf("WSA couldn't start correctly\n"); 
     pause(); 
     exit; 
    } 

    //setting up the socket 
    SOCKET serversock = socket(AF_INET, SOCK_STREAM, 0); 

    //checking socket's validity 
    if (serversock == INVALID_SOCKET) 
    { 
     printf("Socket isn't valid: %d\n", WSAGetLastError()); 
     pause(); 
     exit; 
    } 

    //setting up the sockaddr_in for bind() 
    sockaddr_in server_sockaddr; 
    server_sockaddr.sin_family = AF_INET; 
    server_sockaddr.sin_addr.s_addr = INADDR_ANY; 
    server_sockaddr.sin_port = htons(25565); 

    //binding the socket. 
    int bindcheck = bind(serversock, (struct sockaddr *)&server_sockaddr, sizeof(server_sockaddr)); 

    //checking to see if the bind worked, and calling the error if it doesn't 
    if (bindcheck != 0) 
    { 
     printf("Bind failed: %d\n", WSAGetLastError()); 
     pause(); 
     exit; 
    } 

    //setting the socket to listen 
    int listencheck = listen(serversock, 10); 

    //checking to make sure the listen command was successful 
    if (listencheck != 0) 
    { 
     printf("Listen failed: %d\n", WSAGetLastError()); 
     pause(); 
     exit; 
    } 

    //telling that the socket is being set to listen 
    printf("Socket is ready to accept connections\n"); 

    //accepting any incoming connections 
    SOCKET clientsocket = accept(serversock, NULL, NULL); 

    //checking the socket 
    if (clientsocket == INVALID_SOCKET) 
    { 
     printf("Connecting socket isn't valid or has timed out: %d\n", WSAGetLastError()); 
     pause(); 
     exit; 
    } 
    //ending the program 
    printf("fin\n"); 
    pause(); 
} 

CLIENT.CPP

#include "stdafx.h" 

using namespace std; 


int main() 
{ 
    //setting up WSA 
    WSADATA wsaData; 
    int WSAcheck = WSAStartup(MAKEWORD(2, 2), &wsaData); 

    //checking WSA 
    if (WSAcheck != 0) 
    { 
     printf("WSA couldn't start correctly\n"); 
     pause(); 
     exit; 
    } 

    //setting up the socket 
    SOCKET clientsock = socket(AF_INET, SOCK_STREAM, 0); 

    //checking socket's validity 
    if (clientsock == INVALID_SOCKET) 
    { 
     printf("Socket isn't valid: %d\n", WSAGetLastError()); 
     pause(); 
     exit; 
    } 

    //setting up the struct with the connection info 
    sockaddr_in serverinfo; 
    serverinfo.sin_family = AF_INET; 
    serverinfo.sin_addr.s_addr = INADDR_ANY; 
    serverinfo.sin_port = htons(25565); 

    //connecting 
    printf("Trying to connect\n"); 
    connect(clientsock, (SOCKADDR *)&serverinfo, sizeof(serverinfo)); 
    printf("Passed the connect function\n"); 
    pause(); 
} 

STDAFX.H

// stdafx.h : include file for standard system include files, 
// or project specific include files that are used frequently, but 
// are changed infrequently 

#pragma once 

#include "targetver.h" 

#include <stdio.h> 
#include <tchar.h> 
#include <winsock2.h> 
#include <Ws2tcpip.h> 
#include <Inaddr.h> 
#include <string.h> 
#include <io.h> 
#include <Windef.h> 
#include <Ws2tcpip.h> 
#include <WinNT.h> 
#include <Windows.h> 
#include <tchar.h> 

void pause(void); //defined in stdafx.cpp 

ですpauseはgetchar()として定義され、何が起こっているかを見るためにコードを中断します。

クライアントの出力がある -


にかかわらず、サーバー・プロセスが実行されているかどうかのconnect関数

を合格に接続しようとしています。

サーバーの出力は、私はそれはそれを渡すために取得することはできません、ソケットが接続に関係なく、私がテスト何の

を受け入れる準備ができている

です。

私は間違っていますか?

+0

あなたは 'connect'コールの戻り値を確認することができます結果を追加しますか? –

答えて

3

クライアントにエラーがあります。これは悪いです:

あなたは、彼らが同じサーバーで実行する場合はバイナリ形式で、127.0.0.1多分、サーバーのIPアドレスを記述する必要が代わりにINADDR_ANYの
serverinfo.sin_addr.s_addr = INADDR_ANY; 

。コードは次のようになり

INT WSAAPI InetPton(
    _In_ INT Family, 
    _In_ PCTSTR pszAddrString, 
    _Out_ PVOID pAddrBuf 
); 

https://msdn.microsoft.com/en-us/library/windows/desktop/cc805844(v=vs.85).aspx

:バイナリIPアドレスにテキストIPアドレスから変換する この機能を使用

if(InetPton(AF_INET, "192.168.0.1", (void*)&serverinfo.sin_addr.s_addr) <= 0) 
{ 
    //error 
} 
+0

これは意味があります。 INADDR_ANYは、ポートXXXXへのローカルインターフェイス上の接続試行がプロセスによって受信されるか、またはINADDR_ANYが0.0.0.0を意味するという意味でサーバーと連携しますか? 編集:ああ、私はこの関数を覚えています - これは数週間前に正しい形式のデータ型を取得しようとすると実際の苦労がありました。この例をありがとう! –

+0

@ThomasWoods、あなたのコメントの最初の2行は正しいです! – rodolk

+0

私はInetPton関数でコードの2番目のセクションに問題があります。ドキュメントでは、2番目のパラメータはconst TSTRへのポインタである必要があると言います。私はユニコードを定義しているので、InetPton()の3番目のパラメータで指定されたバッファにバイナリアドレスを使用しています。 [私はこれを書式設定のためにpastebinに入れます](http:// pastebin。 com/w0UPZ6D6) –