Gå til innhold

Problemer med Winsock2 etter maskinbytte(Visa->7)


Anbefalte innlegg

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 av Rockie
Lenke til kommentar
Videoannonse
Annonse

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...