Gå til innhold

[Løst] Hjelp til Asynchronous Winsock


Anbefalte innlegg

Hei

 

Sitter å prøver å lage en data overføring mellom 2 programmer via en socket.

Sånn den er i dag så må jeg selv kjøre connect og listen osv.

Har lagd en callback som jeg fant i exempel ,men vet ikke hvordan jeg faktisk bruker det.

 

Så det jeg ønsker hjelp til er å faktisk lage socketen asynchronous.

 

Her er ServerSocket.cpp fila som jeg bruker:

#include "stdafx.h"
#include "ServerSocket.h"

#define SOCK_STREAM     1
#define SOCK_DGRAM      2
#define SOCK_RAW	3
#define AF_INET		2 
#define IPPROTO_TCP     6

#define MY_MESSAGE_NOTIFICATION	1048

ServerSocket::ServerSocket(){
};

LRESULT CALLBACK ServerSocket::WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
switch(message){
case  MY_MESSAGE_NOTIFICATION:
{
	switch(lParam){
case FD_ACCEPT:{
	cout<<"ACCEPT\n";
	break;	
	}
case FD_CONNECT:{
	cout<<"CONNECT\n";
	break;
	}
case FD_READ:{
	char buffer[80];
	memset(buffer, 0, sizeof(buffer));
	recv(ss, buffer, sizeof(buffer)-1, 0);

	cout<<"READ\n"<<buffer;
	MessageBeep(MB_OK);
	break;
	}

	case FD_CLOSE:{
		Break;
		}
	}
}
break;
default:
	return DefWindowProc(hwnd, message, wParam, lParam);
}
}

ServerSocket::~ServerSocket(){
CloseConnection();
}

int ServerSocket::ListenOnPort(int portno)
{
int error = WSAStartup (0x0202, &w);   // Fill in WSA info

if (error){
	cout<<"Winsock";
	return false; //For some reason we couldn't start Winsock
}

if (w.wVersion != 0x0202) //Wrong Winsock version?
{
	cout<<"version";
	WSACleanup ();
	return false;
}

SOCKADDR_IN addr; // The address structure for a TCP socket


addr.sin_family = AF_INET;      // Address family
addr.sin_port = htons (portno);   // Assign port to this socket
addr.sin_addr.s_addr = htonl (INADDR_ANY);  

ss = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); // Create socket


if (ss == INVALID_SOCKET)
{
	cout<<"create";
	return false; //Don't continue if we couldn't create a //socket!!

}

if (bind(ss, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR)
{
	//We couldn't bind (this will happen if you try to bind to the same  
	//socket more than once)
	cout<<"bind";
	return false;
}

cout<<"shhh!! listen\n";
listen(ss, SOMAXCONN);
WSAAsyncSelect(ss,hwnd ,MY_MESSAGE_NOTIFICATION ,FD_ACCEPT | FD_CONNECT | FD_READ | FD_CLOSE);	
}

}

Endret av BlueDude
Lenke til kommentar
Videoannonse
Annonse

Svarer på min egen tråd tilfelle det skulle være andre som trengte noe lignende.

 

Siden jeg brukte VCL forms så virket det som om det var vanskelig å få til en Async.Socket

ved hjelp av window messages som jeg prøvde på i første posten, I stede gikk jeg over til å bruke WSAEventSelect() isteden for å bruke WSAAsyncSelect(), Dette gjør at man tar i mot events og legger de til en eventlist og behandler de ut i fra det.

 

Brukte denne tutorial`n til hjelp med å bygge om socketene mine:

winsocket

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...