16/04/22 12:15
Gemini
Salve a tutti e auguri posticipati per pasqua ^_^....
ho un problema con le socket di windows.... non capisco perchè se voglio passare un socket a una funzione dentro una classe mi da errore 10038... leggendo su google mi dice che io non passo il socket al bind.... cmq per farvi capire meglio ecco i source
CLASSE NETWORK.H
CLASSE NETWORK:CPP
//===================== CLIENT/SERVER =========================//
SERVER:CPP
CLIENT.CPP
se uso la classe senza passargli un socket e implementandola nella classe funziona...invece se la passo io no...
non so xke.... :\
ho un problema con le socket di windows.... non capisco perchè se voglio passare un socket a una funzione dentro una classe mi da errore 10038... leggendo su google mi dice che io non passo il socket al bind.... cmq per farvi capire meglio ecco i source
CLASSE NETWORK.H
#include <winsock2.h> #include <iostream> #pragma comment(lib, "ws2_32.lib") class Networks { public: //Normal Socket bool ServerTCP(SOCKET m_socket, SOCKET a_socket, const char *ip, int port); bool ClientTCP(SOCKET m_socket, const char *ip, int port); //WSASocket bool WSAServerTCP(SOCKET m_socket, SOCKET a_socket, const char *ip, int port); bool WSAClientTCP(SOCKET m_socket, const char *ip, int port); bool Send(SOCKET s_socket, const char *buffer); std::string Recv(SOCKET r_socket); bool isConnected = false; private: //Variabili Socket Private WORD DllVersion = MAKEWORD(2,2); WSADATA wsaData; sockaddr_in si; sockaddr_in a_si; //SOCKET m_socket; //SOCKET a_socket; bool is_Server = false; bool is_Client = false; bool is_WSASocket = false; //Metodi Socket Privati bool InitSocket(); bool CreateSocket(SOCKET m_socket, const char *ip, int port); bool CloseSocket(SOCKET m_socket, SOCKET a_socket); //Metodi Client Socket bool ConnectSocket(SOCKET m_socket); //Metodi Server Socket bool BindSocket(SOCKET m_socket); bool AcceptSocket(SOCKET m_socket, SOCKET a_socket); };
CLASSE NETWORK:CPP
#include "Networks.h" //===============================================// //= ServerTCP =// //===============================================// bool Networks::ServerTCP(SOCKET m_socket, SOCKET a_socket, const char *ip, int port) { is_Server = true; if(!InitSocket()) return false; if(!CreateSocket(m_socket, ip, port)) return false; if(!BindSocket(m_socket)) return false; //Qui forse ci vuole un while true if(!AcceptSocket(m_socket, a_socket)) return false; isConnected = true; return true; } //===============================================// //= ClientTCP =// //===============================================// bool Networks::ClientTCP(SOCKET m_socket, const char *ip, int port) { is_Client = true; if(!InitSocket()) return false; if(!CreateSocket(m_socket, ip, port)) return false; //Qui forse ci vuole un while if(!ConnectSocket(m_socket)) return false; isConnected = true; return true; } //===============================================// //= WSAServerTCP =// //===============================================// bool Networks::WSAServerTCP(SOCKET m_socket, SOCKET a_socket, const char *ip, int port) { is_WSASocket = true; is_Server = true; if(!InitSocket()) return false; if(!CreateSocket(m_socket, ip, port)) return false; if(!BindSocket(m_socket)) return false; //Qui forse ci vuole un while true if(!AcceptSocket(m_socket, a_socket)) return false; isConnected = true; return true; } //===============================================// //= WSAClientTCP =// //===============================================// bool Networks::WSAClientTCP(SOCKET m_socket, const char *ip, int port) { is_WSASocket = true; is_Client = true; if(!InitSocket()) return false; if(!CreateSocket(m_socket, ip, port)) return false; //Qui forse ci vuole un while if(!ConnectSocket(m_socket)) return false; isConnected = true; return true; } //===============================================// //= initWSASocket =// //===============================================// bool Networks::InitSocket() { int WsaResult = WSAStartup(DllVersion, &wsaData); if(WsaResult != 0) { std::cout << "Fallito WSAStartup()." << std::endl; return false; } return true; } //===============================================// //= createWSASocket =// //===============================================// bool Networks::CreateSocket(SOCKET m_socket, const char *ip, int port) { //Normal Socket if(is_WSASocket == false) m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); else if(is_WSASocket == true) //WSA SOCKET m_socket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, (unsigned int)NULL, (unsigned int)NULL); if(m_socket == INVALID_SOCKET) return false; memset(&si, 0, sizeof(si)); if(is_Server == true) { si.sin_family = AF_INET; if(ip == NULL) si.sin_addr.s_addr = INADDR_ANY; else si.sin_addr.s_addr = inet_addr(ip); si.sin_port = htons(port); } else if(is_Client == true) { si.sin_family = AF_INET; si.sin_addr.s_addr = inet_addr(ip); si.sin_port = htons(port); } else { std::cout << "Il socket non e' ne di tipo server ne di tipo client" << std::endl; return false; } return true; } //===============================================// //= closeWSASocket =// //===============================================// bool Networks::CloseSocket(SOCKET m_socket, SOCKET a_socket) { if(is_Server == true) { if(!closesocket(a_socket)) return false; } if(!closesocket(m_socket)) return false; if(!WSACleanup()) return false; return true; } //===============================================// //= ConnectSocket =// //===============================================// bool Networks::ConnectSocket(SOCKET m_socket) { int ConnResult; //Normal Socket if(is_WSASocket == false) ConnResult = connect(m_socket, (struct sockaddr*)&si, sizeof(si)); else if(is_WSASocket == true) //WSA SOCKET ConnResult = WSAConnect(m_socket, (struct sockaddr*)&si, sizeof(si), NULL, NULL, NULL, NULL); if(ConnResult == SOCKET_ERROR) { std::cout << "errore %d"<< WSAGetLastError() << std::endl; CloseSocket(m_socket, 0); return false; } return true; } //===============================================// //= bindSocket =// //===============================================// bool Networks::BindSocket(SOCKET m_socket) { if (bind(m_socket, (struct sockaddr*)&si, sizeof(si)) == SOCKET_ERROR) { std::cout << "Fallito bindSocket(). Errore: " << WSAGetLastError() << std::endl; CloseSocket(m_socket, 0); return false; } //Listen if(listen(m_socket, 3) == SOCKET_ERROR) { std::cout << "Fallito listen(). Errore: " << WSAGetLastError() << std::endl; CloseSocket(m_socket, 0); return false; } return true; } //===============================================// //= acceptWSASocket =// //===============================================// bool Networks::AcceptSocket(SOCKET m_socket, SOCKET a_socket) { int len = sizeof(a_si); int AcceptResult; //Normal Socket if(is_WSASocket == false) a_socket = accept(m_socket, (struct sockaddr*)&a_si, &len); else if(is_WSASocket == true) //WSA SOCKET a_socket = WSAAccept(m_socket, (struct sockaddr*)&a_si, &len,NULL,0); /*if((a_socket = WSAAccept(m_socket, (struct sockaddr*)&a_si, &len,NULL,0)) == INVALID_SOCKET) { std::cout << "Fallito WSAAccept(). Errore: " << WSAGetLastError() << std::endl; CloseSocket(); return false; }*/ if(a_socket == INVALID_SOCKET) { std::cout << "Fallito WSAAccept(). Errore: " << WSAGetLastError() << std::endl; CloseSocket(m_socket, a_socket); return false; } return true; } //===============================================// //= Send =// //===============================================// bool Networks::Send(SOCKET s_socket, const char *sendbuffer) { int ResultSend; if(is_Server == true) { ResultSend = send(s_socket, sendbuffer, (int) strlen(sendbuffer), 0); } else if(is_Client == true) { ResultSend = send(s_socket, sendbuffer, (int) strlen(sendbuffer), 0); } else { std::cout << "Nessun socket specificato!!!" << std::endl; return false; } if(ResultSend == SOCKET_ERROR) { std::cout << "Errore Send(): " << WSAGetLastError() << std::endl; CloseSocket(s_socket, 0); return false; } std::cout << "Messaggio inviato!" << std::endl; return true; } //===============================================// //= Recv =// //===============================================// std::string Networks::Recv(SOCKET r_socket) { const int recvbufflen = 1024; char recvbuffer[recvbufflen]; int ResultRecv; do { if(is_Server == true) { ResultRecv = recv(r_socket,recvbuffer, recvbufflen, 0); } else if(is_Client == true) { ResultRecv = recv(r_socket,recvbuffer, recvbufflen, 0); } else { std::cout << "Nessun socket specificato!!!" << std::endl; return "false"; } if(ResultRecv > 0) { recvbuffer[ResultRecv] = 0; //std::cout << "byte ricevuti" << ResultRecv << " " << recvbuffer << std::endl; return recvbuffer; } else if(ResultRecv == 0) std::cout << "Connesione chiusa!" << std::endl; else std::cout << "Error Recv(): " << WSAGetLastError() << std::endl; } while (ResultRecv > 0); return "true"; }
//===================== CLIENT/SERVER =========================//
SERVER:CPP
#include "Networks.h" int main() { Networks ntw; SOCKET m_socket, a_socket; if(!ntw.ServerTCP(m_socket, a_socket, "127.0.0.1", 1234)) { std::cout << "Errore" << std::endl; } if(ntw.isConnected) { std::cout << "Connesso" << std::endl; system("PAUSE"); } return 0; }
CLIENT.CPP
#include "Networks.h" int main() { Networks ntw; SOCKET m_socket; if(!ntw.ClientTCP(m_socket, "127.0.0.1", 4444)) { std::cout << "Errore" << std::endl; } if(ntw.isConnected) { std::cout << "Connesso" << std::endl; system("PAUSE"); } return 0; }
se uso la classe senza passargli un socket e implementandola nella classe funziona...invece se la passo io no...
non so xke.... :\