hakonvl Skrevet 20. april 2011 Del Skrevet 20. april 2011 (endret) Hei Sitter på TG med et prosjekt som krever winsock2. Før jeg dro jobba jeg på to ei annen maskin, men har nå flytta over på den maskina jeg har med på TG. Programmet kompilerer, men jeg kjører inn i en feil. Siden det er en stund siden jeg har jobbet med C++, og heller aldri har jobbet med store prosjekter i C++ har jeg basert koden min på en guide fra MSDN, her. Feilmeldingen jeg får er: Setting up conenction Unable to connect to server! Sending name:send failed: 10038 comm.cpp: #include "includes.h" //#define _WIN32_WINNT 0x501 #include <winsock2.h> #include <ws2tcpip.h> comm::comm(){ int iResult; printf("Setting up conenction\n"); iResult = WSAStartup(MAKEWORD(2,2), &wsaData); // Initialize Winsock iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != 0) { printf("WSAStartup failed: %d\n", iResult); //return 1; } struct addrinfo *result = NULL, *ptr = NULL, hints; ZeroMemory( &hints, sizeof(hints) ); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; // Resolve the server address and port iResult = getaddrinfo(DEFAULT_HOST, DEFAULT_PORT, &hints, &result); if (iResult != 0) { printf("getaddrinfo failed: %d\n", iResult); WSACleanup(); //return 1; } this->ConnectSocket = INVALID_SOCKET; // Attempt to connect to the first address returned by // the call to getaddrinfo ptr=result; // Create a SOCKET for connecting to server this->ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (this->ConnectSocket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); //return 1; } // Connect to server. iResult = connect( this->ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); if (iResult == SOCKET_ERROR) { closesocket(this->ConnectSocket); ConnectSocket = INVALID_SOCKET; } // Should really try the next address returned by getaddrinfo // if the connect call failed // But for this simple example we just free the resources // returned by getaddrinfo and print an error message freeaddrinfo(result); if (this->ConnectSocket == INVALID_SOCKET) { printf("Unable to connect to server!\n"); WSACleanup(); //return 1; } } bool comm::write(char * msg){ int iResult; // Send an initial buffer iResult = send(this->ConnectSocket, msg, (int) strlen(msg), 0); if (iResult == SOCKET_ERROR) { printf("send failed: %d\n", WSAGetLastError()); closesocket(this->ConnectSocket); WSACleanup(); } //printf("Sent:", msg); return true; } char comm::read(){ int recvbuflen = DEFAULT_BUFLEN; //char sendbuf[] = "this is a test"; //char recvbuf[DEFAULT_BUFLEN]; return recv(this->ConnectSocket, this->recvbuf, recvbuflen, 0); //char returnVar = recvbuf; } void comm::shutdownSocket(){ int iResult; iResult = shutdown(this->ConnectSocket, SD_SEND); if (iResult == SOCKET_ERROR) { printf("shutdown failed: %d\n", WSAGetLastError()); closesocket(this->ConnectSocket); WSACleanup(); } } comm.h: #ifndef COMM_H #define COMM_H #include <winsock2.h> #include <ws2tcpip.h> //#include <stdio.h> #include "includes.h" class comm{ public: comm(); bool write(char *); void shutdownSocket(); char read(); char recvbuf[DEFAULT_BUFLEN]; SOCKET ConnectSocket; private: WSADATA wsaData; }; #endif includes.h //#ifndef INCLUDES_H #define INCLUDES_H #define WINVER 0x0600 #include <iostream> #include <string> #include <stdio.h> #include "comm.h" #define DEFAULT_NAME "something" #define DEFAULT_HOST "localhost" #define DEFAULT_PORT "1986" #define DEFAULT_BUFLEN 512 #pragma comment(lib, "ws2_32.lib") //#endif using namespace std; Selve kallet fra main.cpp: char *name = "NAME hakonvl \n"; int result; printf("Sending name:"); connection.write(name);[code] Jeg har prøvd både gcc fra MinGW og compileren i Visual C++ Express. Jeg får tilsendt de gamle filene hjemmefra, så jeg skal se om det hjelper men jeg tviler. Koden skal så vidt jeg husker ha fungert fint hjemme. Jeg har også søkt opp feilkoden på MSDN, men jeg finner ikke ut hva som kan være feil. WSAENOTSOCK 10038 Socket operation on nonsocket. An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid. Noen som ser hvor feilen kan ligge? Takker for all hjelp Edit: Fikk nå en gammel build av prosjektet og har fortsatt samme problem. Jeg vil tro at det er Windows 7 som lager tull. Skal laste ned XP mode og sjekke der, men jeg er ikke sikker på hva jeg skal gjøre nå. Edit2: Fungerer fint i XP mode, ser ut som om jeg må fortsette der om jeg ikke finner noe løsning på dette. Endret 20. april 2011 av Rockie Lenke til kommentar
Mad86 Skrevet 21. april 2011 Del Skrevet 21. april 2011 prøv uten wrapper. en connect knapp private: System::Void Connect_btn_Click(System::Object^ sender, System::EventArgs^ e) { port = htons(port.Parse(portBox->Text)); IntPtr ip = Marshal::StringToHGlobalAnsi(ipBox->Text); const char* str = static_cast<const char*>(ip.ToPointer()); init_winsock(port, str); #define _WINSOCKAPI_ // Don't include Winsock.h #include <winsock2.h> // WinSock header file #pragma comment(lib, "Ws2_32.lib") // WinSock Library WSADATA Winsock; SOCKET Socket; sockaddr_in RemoteAddress; // the address to send data to int SizeInt = sizeof(RemoteAddress); // the size of the address void init_winsock(unsigned short int REMOTE_PORT, const char* REMOTE_ADDRESS) { WSAStartup(MAKEWORD(2, 2), &Winsock); if(LOBYTE(Winsock.wVersion) != 2 || HIBYTE(Winsock.wVersion) != 2) // Check version { WSACleanup(); return; } // Make the Socket Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // Input Receiver Information ZeroMemory(&RemoteAddress, sizeof(RemoteAddress)); // clear the struct RemoteAddress.sin_family = AF_INET; // set the address family RemoteAddress.sin_addr.s_addr = inet_addr(REMOTE_ADDRESS); // set the IP address RemoteAddress.sin_port = REMOTE_PORT; // set the port } void send_packet(SomeStruct* data) { sendto(Socket, (char*)data, sizeof(SomeStruct), 0, (sockaddr*)&RemoteAddress, sizeof(sockaddr)); } Lenke til kommentar
hakonvl Skrevet 22. april 2011 Forfatter Del Skrevet 22. april 2011 FIkk det akkuratt til, problemet ligger i getaddrinfo() ikke fant domenet localhost, så om jeg må legge inn et DNS lookup i stedet for getaddrinfo som leser fra hosts fila (?), hvor localhost er kommentert vekk i Win7 av en eller annen grunn. Det fungerer i allefall om jeg setter 127.0.0.1 som DEFAULT_HOST Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå