websocket client ağ üzerinde bağlanamıyor

Başlatan Gökhan BEKEN, 13 Eylül 2015, 22:47:57

Gökhan BEKEN

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ışı.
Özel mesaj okumuyorum, lütfen göndermeyin.

Icarus

iResult = getaddrinfo(NULL, PORT_NO_, &hints, &result);
Yanlış
IP adresi yok ?
Birde unutmamak gerekir sonuç bir tane olmayabilir.

Gökhan BEKEN

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ü:
Özel mesaj okumuyorum, lütfen göndermeyin.

Icarus

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

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

Gökhan BEKEN

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?
Özel mesaj okumuyorum, lütfen göndermeyin.