Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => C/C++ => Konuyu başlatan: Gökhan BEKEN - 13 Eylül 2015, 22:47:57

Başlık: websocket client ağ üzerinde bağlanamıyor
Gönderen: Gökhan BEKEN - 13 Eylül 2015, 22:47:57
C++ ile iki adet websocket uygulaması yaptım, WSA kullanıyorum.
Client'e yerel ağdaki ip( 192.168.1.8 ) ve sunucunun açtığı portu yazdım.
Aynı bilgisayarda çalıştırdığımda sorun yok.
Aynı ağda bulunan başka bir bilgisayarda çalıştıramadım. Ama putty ile(telnet üzerinden) bağlandığımda sorun yok.
(bu arada güvenlik duvarını pasif bırakmam gerekiyor, yoksa putty'de bağlanamıyor)

Sorun benim client kodlarımda sanırım.

kodlarım:
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <iostream>

#define _WINNT_WIN32 0x0601
#include <winsock2.h>
//#define _WIN32_WINNT 0x501
#include <ws2tcpip.h>


#include <windows.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <string.h>


#define DEBUG_AKTIF


#pragma comment(lib, "Ws2_32.lib")


using namespace std;


#define IP_ADRESS "192.168.1.8"
#define PORT_NO_ "987"


#define DEFAULT_BUFLEN 512

char sendbuf[DEFAULT_BUFLEN];
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;




int iResult;
int iSendResult;



int main(int argv,char** argc)
{
    WSADATA wsa;
    WORD Version = MAKEWORD(2, 1);


    // Initialize Winsock
iResult = WSAStartup(Version, &wsa);
if (iResult != 0) {
    printf("WSAStartup failed: %d\n", iResult);
    return 1;
}
printf("WSA olusturuldu\r\n");


struct addrinfo *result = NULL, *ptr = NULL, hints;

ZeroMemory(&hints, sizeof (hints));
hints.ai_family = AF_INET; //AF_UNSPEC olursa calismaz
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;



// Resolve the server address and port
iResult = getaddrinfo(NULL, PORT_NO_, &hints, &result);
if (iResult != 0) {
    printf("getaddrinfo failed: %d\n", iResult);
    WSACleanup();
    return 1;
}

printf("getaddrinfo calistirildi\r\n");


SOCKET ConnectSocket = INVALID_SOCKET; //Create a SOCKET object called ConnectSocket.

ptr=result;

// Create a SOCKET for connecting to server
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);


//Check for errors to ensure that the socket is a valid socket. :
if (ConnectSocket == INVALID_SOCKET) {
    printf("Error at socket(): %ld\n", WSAGetLastError());
    freeaddrinfo(result);
    WSACleanup();
    return 1;
}


// Connect to server.
iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
if (iResult == SOCKET_ERROR) {
printf("Baglanti kurulamadi \r\n");
    closesocket(ConnectSocket);
    ConnectSocket = INVALID_SOCKET;
}

freeaddrinfo(result);

if (ConnectSocket == INVALID_SOCKET) {
    printf("Unable to connect to server!\n");
    WSACleanup();
    return 1;
}
printf("Servera baglanildi \r\n");










iResult = send(ConnectSocket, "deneme", 6, 0);
if (iResult == SOCKET_ERROR) {
    printf("send failed: %d\n", WSAGetLastError());
    closesocket(ConnectSocket);
    WSACleanup();
    return 1;
}
// Receive until the peer shuts down the connection
do {

    iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
    if (iResult > 0) {
    #ifdef DEBUG_AKTIF
        printf("Bytes received: %d\n", iResult);
     
        printf("\r\n*****\r\n");
        printf("Gelen veri: \r\n");
        printf("%s\r\n", recvbuf);
        printf("*****\r\n\r\n", recvbuf);
        #else
        printf("%s", recvbuf);
        //printf("0x%02X , ", (unsigned char)recvbuf[0]); //hex olarak yazar
        //not: eger putty ile baglaniyorsan, ilk basta sunlari gonderir: 0xFF,0xFF,0xFF,0xFF,0xFF (5 adet 255)
       
        #endif

        // Echo the buffer back to the sender
        iSendResult = send(ConnectSocket, recvbuf, iResult, 0);
        if (iSendResult == SOCKET_ERROR) {
            printf("send failed: %d\n", WSAGetLastError());
            closesocket(ConnectSocket);
            WSACleanup();
            return 1;
        }
        #ifdef DEBUG_AKTIF
        printf("Bytes sent: %d\n", iSendResult);
      #endif
        memset(recvbuf,0,recvbuflen); //veri geldikten sonra, echo'yu da yaptiktan sonra bufferi temizleyelim ki yeni veri geldiginde eskiler bozmasin isi
    }
} while (iResult > 0);





// cleanup
closesocket(ConnectSocket);
WSACleanup();

    cin.get();
    return 0;
}



düzeltme: yazım yanlışı.
Başlık: Ynt: websocket cliend ağ üzerinde bağlanamıyor
Gönderen: Icarus - 13 Eylül 2015, 23:26:54
iResult = getaddrinfo(NULL, PORT_NO_, &hints, &result);
Yanlış
IP adresi yok ?
Birde unutmamak gerekir sonuç bir tane olmayabilir.
Başlık: Ynt: websocket client ağ üzerinde bağlanamıyor
Gönderen: Gökhan BEKEN - 14 Eylül 2015, 01:25:31
ahhh dalgınlığıma gelmiş,
iResult = getaddrinfo(IP_ADRESS, PORT_NO_, &hints, &result);
olarak değiştirince düzeldi, teşekkür ederim.

hocam "sonuç bir tane olmayabilir." derken neyden bahsettiniz tam anlamadım.

Bir de şöyle bir sorum olacak, yardımcı olursanız sevinirim. Client olarak javascript çalıştırdığımda, server'a bağlantı geliyor, fakat javascript error verip bağlantıyı kapatıyor. Bunun sebebini bulamadım henüz.


javascript kodlarım şu şekilde:


function connectServer()
{
websocket = new WebSocket("ws://192.168.1.8:987");

websocket.binaryType = "arraybuffer";
websocket.onopen = function(evt) { onOpen(evt) };
websocket.onclose = function(evt) { onClose(evt) };
websocket.onmessage = function(evt) { onMessage(evt) };
websocket.onerror = function(evt) { onError(evt) };

if (destekGenel==0)
{
source.noteOn(0);
}
}

function onMessage(evt) // gelen mesajlar burda ekrana yazılıyor
{
writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>');
}
 

function onOpen(evt) {
writeToScreen("CONNECTED");
doSend("Bu mesaj karsi tarafa gitmis olmali \r\n");

function doSend(message) { // karşı tarafa gönderme fonksiyonu
writeToScreen("SENT: " + message);
websocket.send(message);


function onClose(evt) // soket kapatıldığında otomatik olarak bu fonksiyona girer
{
writeToScreen("DISCONNECTED");
}

function onError(evt)
{
writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);




function writeToScreen(message)
{
var pre = document.createElement("p");
pre.style.wordWrap = "break-word";
pre.innerHTML = message;
output.appendChild(pre);



ekran görüntüsü:
(http://s26.postimg.cc/snleh06eh/js_hata.png)
Başlık: Ynt: websocket client ağ üzerinde bağlanamıyor
Gönderen: Icarus - 14 Eylül 2015, 12:48:45
Alıntı yapılan: Gökhan BEKEN - 14 Eylül 2015, 01:25:31
ahhh dalgınlığıma gelmiş,
iResult = getaddrinfo(IP_ADRESS, PORT_NO_, &hints, &result);
olarak değiştirince düzeldi, teşekkür ederim.

hocam "sonuç bir tane olmayabilir." derken neyden bahsettiniz tam anlamadım.
Formal olarak getaddrinfo birden fazla bağlantı noktası döndürebilir. Bu durumda hepsine işlem yapmak daha doğru olur.
Şöyle bir örnek var
http://linux.die.net/man/3/getaddrinfo (http://linux.die.net/man/3/getaddrinfo)

Alıntı yapılan: Gökhan BEKEN - 14 Eylül 2015, 01:25:31

Bir de şöyle bir sorum olacak, yardımcı olursanız sevinirim. Client olarak javascript çalıştırdığımda, server'a bağlantı geliyor, fakat javascript error verip bağlantıyı kapatıyor. Bunun sebebini bulamadım henüz.


javascript kodlarım şu şekilde:
malesef Javascript hiç bilmiyorum
Başlık: Ynt: websocket client ağ üzerinde bağlanamıyor
Gönderen: Gökhan BEKEN - 14 Eylül 2015, 15:28:05
Hocam aslında javascript ile aynı kodları kullanarak başka bir websocket'e bağlanmıştım hem de canlı ses streaming yapmıştım.
Bunu linux ortamında libwebsock kütüphanesi ile yapmıştım.
Yani sorun benim windows ortamında yaptığım soket programında gibi geldi bana.
Ben soket konusunda çok bilgili değilim, windowsun soket kütüphanesinde farklı bir protokol felan mı var acaba?