C++ da soket programlama

Apollonlykos
10-06-2019, 15:44   |  #1  
Apollonlykos avatarı
OP Taze Üye
Teşekkür Sayısı: 0
1 mesaj
Kayıt Tarihi:Kayıt: Haz 2019

Windows 10 da bir c++ soket programı yazmaya çalışıyorum, server.cpp ve client.cpp çalışıyor ancak,ikisi arasında bağ kuramıyorum hata kodu olarak 10047 hata kodunu vermekte,kodumu göstereyim;

//SERVER

#include<iostream>
#include<winsock2.h>
#include<windows.h>
#include<ws2tcpip.h>
int main(){
     WSADATA wsaData;
     if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
     std::cout<<"WSAStartup hatasi."<<std::endl;
     exit(1);
     }
   std::cout<<"--------------------SERVER------------------"<<std::endl;
   SOCKET sock;
   sock=socket(AF_INET,SOCK_STREAM,0);
   if(sock==INVALID_SOCKET){
    std::cout<<"Socket hatasi."<<std::endl;
   }
   struct sockaddr_in adres;
   adres.sin_addr.s_addr=INADDR_ANY;
   adres.sin_family=AF_INET;
   adres.sin_port=htons(5055);
   int a;
   a=bind(sock,(struct sockaddr*)&adres,sizeof(adres));
   if(a==-1){
    std::cout<<"Hata //bind//:"<<WSAGetLastError()<<std::endl;
   }
   int l=listen(sock,5);
    if(l==-1){
    std::cout<<"Listen hatasi."<<std::endl;
   }
   //cONNECTYON BEKLEME;
   struct sockaddr_in client;
   int adres_size=sizeof(client);
   SOCKET client_socket=accept(sock,(struct sockaddr*)&client,&adres_size);
   char message_from_client[1024];
   int r;
   closesocket(sock);
   while(1){

    if(client_socket!=-1){
        r=recv(sock,message_from_client,1024,0);
        if(r!=-1){
            std::cout<<"Client:"<<message_from_client;
        }
    }
    else{
       // std::cout<<"Baglanan birisi var ancak pm atmiyor."<<std::endl;
    }
   }
   closesocket(sock);
   WSACleanup();
  return 0;
}

//CLİENT

#include<iostream>
#include<winsock2.h>
#include<windows.h>
#include<ws2tcpip.h>
#include<string.h>
#include<string>
#pragma comment (lib,"ws2_32.lib")
int main(){
     WSADATA wsaData;
     if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
     std::cout<<"WSAStartup hatasi"<<std::endl;
     exit(1);
     }
    std::cout<<"--------------------CLIENT------------------"<<std::endl;
    SOCKET cl_sock;
    cl_sock=socket(AF_INET,SOCK_STREAM,0);
    if(cl_sock==INVALID_SOCKET){
        std::cout<<"Socket hatasi."<<std::endl;
    }
    struct sockaddr_in cl_adres;
    cl_adres.sin_addr.s_addr=INADDR_ANY;
    cl_adres.sin_family=AF_INET;
    cl_adres.sin_port=htons(5055);
    char message[1024];
    struct sockaddr_in server_adres;
    while(1){
    SOCKET c=connect(cl_sock,(struct sockaddr*)&server_adres,sizeof(server_adres));
        if(c!=-1){
            std::cout<<"Mesaj:";
            std::cin>>message[1024];
            send(cl_sock,&message[1024],1024+1,0);
        }
        else{
            std::cout<<"Serverle baglanti kurulamadi."<<std::endl;
            Sleep(750);
            std::cout<<WSAGetLastError();
        }
    }
    closesocket(cl_sock);
    WSACleanup();
    return 0;
}

Sistem Bilgilerim
errorno
29-06-2019, 03:11   |  #2  
Taze Üye
Teşekkür Sayısı: 1
16 mesaj
Kayıt Tarihi:Kayıt: Ara 2017

Merhaba,

ilk olarak hatanızın orjinal tanımlamasını veriyorum.


10047 WSAEAFNOSUPPORT
Address family not supported by protocol family.
An address incompatible with the requested protocol was used. All sockets are created with an associated address family (that is, AF_INET for Internet Protocols) and a generic protocol type (that is, SOCK_STREAM). This error is returned if an incorrect protocol is explicitly requested in the socket call, or if an address of the wrong family is used for a socket, for example, in sendto.

Yazdığınız kodlarda hangi protokolü kullandığınızı göremedim. Ya da diğer bir ihtmal gözümden kaçmış olabilir. Tavsiye olarak şöyle;sockaddr_in yerine addrinfo yapısını kullanın. Sanırım bu hatadan sonra da htons ile de sorun yaşayabilirsiniz (kesin değil, sadece tecrübe ettiğim için aklımda kalanı yazdım). İlgili başlık dosyasında (ws2def.h) açıklaması yazıyor aşağıdaki gibi:

int                 ai_protocol;    // 0 or IPPROTO_xxx for IPv4 and IPv6

Demek istediğim protokol belirtmek zorundasınız bağlantı sağlamak için. IPv4 ve IPv6 desteği var TCP için. Server için kısa bilgilendirme kodu aşağıdaki gibidir. Geri kalanı sanırım siz hem clıent hem de server için tamamlayabilirsiniz. Mantığı vermek istedim sadece.


#define DEFAULT_PORT "istenilen_portu_yazın"

struct addrinfo ornek;
struct addrinfo *central = NULL;

ZeroMemory(&ornek, sizeof(ornek));
ornek.ai_family = AF_INET;
ornek.ai_socktype = SOCK_STREAM; 
ornek.ai_protocol = IPPROTO_TCP;
ornek.ai_flags = AI_PASSIVE; //Socket adresinin bind içerisinde çağırılması gerektiğini belirtiyoruz.


getaddrinfo("ip_adresi", DEFAULT_PORT, &ornek, ¢ral);
SOCKET centralSocket = INVALID_SOCKET;
centralSocket = socket(central->ai_family, central->ai_socktype, central->ai_protocol);
bind(centralSocket, central->ai_addr, (int)central->ai_addrlen);
listen(centralSocket, SOMAXCONN); //SOMAXCONN : port dinlemede maksimum kuyruk uzunluğu.
.
.

Yada kodlarında kendiniz port belirtme yöntemine gidebilirsiniz. Benim yazdıklarımda kodlarınızın çoğu kımını değiştirmek zorunda kalabilirsiniz.

Saygılarımla