PDA

Visualizza la versione completa : [C++] Socket e cambio di parametri


the wizard87
07-09-2011, 10:17
salve a tutti mi servirebbe un aiuto per la programmazione di un programmino che mi stato dato per un progetto di informatica.
il programmino per una connessione socket in cui lanciandolo aspetta fino a che non riceve un pacchetto di dati.
questo pacchetto settato a un byte.
ora per il mio progetto dovrei rielaborarlo da un byte a due byte che mi servono.
posso semplicemente sostituire i valori del programma o devo cambiare altro??
grazie mille per l'aiuto

// Exampole.cpp : Defines the entry point for the console application.

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <map>
#include <utility> // make_pair
#include <string>
#include <winsock2.h>
#include <string.h>
using namespace std;

#define FLASH

#define WAIT 0
#define GO 1
#define STOP 2
#define QUIT 3
#define DISCONNECT 4
#define CONNECT 5

int count = 0;
int state = WAIT;
char buf[128];

DWORD WINAPI ThreadProc(LPVOID lpParameter){
SOCKET* client;
int n;
client = (SOCKET *)lpParameter;
while(1){
n = recv(*client,buf,1,0);
if(n <= 0){
state = QUIT;
return 1;
}
switch(buf[0]){
case 'I':
state = GO;
break;
case 'S' :
state = STOP;
break;
case 'Q' :
state = QUIT;
break;
case 'D' :
state = DISCONNECT;
break;
case 'C' :
state = CONNECT;
break;
default:
break;
}
printf("State is: %d",state);
}
return 1;
}


int main(int argc, char* argv[])
{
/*
GESTIONE SOCKET
*/

WSADATA data_ws; // inizializzo la variabile che contiene le primitive di Winsock
WORD p;
int lun;
SOCKET sock, sock_client;
struct sockaddr_in sock_addr, sock_addr_client;
int n;
HANDLE h;

int err=0; // inizializzo una variabile per gestire gli errori
unsigned char ip[4];

ip[0] = 127;
ip[1] = 0;
ip[2] = 0;
ip[3] = 1;

DWORD id1;



p=MAKEWORD(2,0); // creo la variabile p che contiene la versione della wsock32.dll
err=WSAStartup(p,&data_ws); // inizializzo la wsock32.dll verificandone la mancanza di errori

sock=socket(PF_INET,SOCK_STREAM,0);
sock_addr.sin_family=PF_INET; // indico il protocollo utilizzato (TCP/IP)

sock_addr.sin_port=htons(63000); //indico la porta a cui connettere il socket
sock_addr.sin_addr.S_un.S_un_b.s_b1=ip[0]; // indico l'indirizzo IP
sock_addr.sin_addr.S_un.S_un_b.s_b2=ip[1];
sock_addr.sin_addr.S_un.S_un_b.s_b3=ip[2];
sock_addr.sin_addr.S_un.S_un_b.s_b4=ip[3];

err=bind(sock,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr));
err=listen(sock,1);

lun = sizeof(struct sockaddr_in);
//rimango in attesa della connessione da parte di un process...
sock_client = accept(sock,(struct sockaddr*)&sock_addr_client,&lun);

//avvio il processo di lettura
if( (h=CreateThread(NULL,0,ThreadProc,&sock_client,0,&id1)) == NULL )
return FALSE;
//avvio il processo di inventory...
printf("Connession Accettata\n");
while(state!=QUIT){

if(state == CONNECT){
printf("Connected..\n");
}

if(state == GO)
{
printf("State GO\n");
Sleep(1000);
}

if(state == STOP){
state = WAIT;
}
if(state == WAIT){
printf("State Wait\n");
Sleep(100);
}

if(state == DISCONNECT){
state = WAIT;
buf[0] = 'O';
buf[1] = 'K';
send(sock_client,buf,2,0);
}
}

WaitForSingleObject(h,50);

closesocket(sock_client);
closesocket(sock);

Sleep(100);
printf("Termine Programma\n");
WSACleanup();
return 0;
}

alka
07-09-2011, 10:30
Il linguaggio va indicato anche nel titolo, come da Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887).

Qui l'ho aggiunto io.

the wizard87
07-09-2011, 10:42
grazie mille scusa in anticipo

oregon
07-09-2011, 11:29
Originariamente inviato da the wizard87
rielaborarlo da un byte a due byte


Cio ?

the wizard87
07-09-2011, 11:36
in pratica il software che ho inviato decodifica comandi ad 1byte (o carattere). Quello che devo cercare di fare di estendere la decodifica da 1byte a pi byte (questo caso 2) in funzione del protocollo che devo prevedere:

a) byte di sincronizzazione
b) byte del tipo
c) byte della lunghezza dei dati
d) byte(s) dei dati (0...N)
e) eventuale checksum

Loading