Red de conocimiento del abogados - Preguntas y respuestas jurídicas - Cuéntame sobre toda la sintaxis de winsock en free pascal. No encuentro un tutorial. Buenos puntos de bonificación.

Cuéntame sobre toda la sintaxis de winsock en free pascal. No encuentro un tutorial. Buenos puntos de bonificación.

Lo he hecho antes con Delphi, Pascal también se puede usar pero es más problemático. Un programa general consta de tres pasos: creación, vinculación y monitoreo

Permítanme darles un programa directamente. El núcleo de la sintaxis es la primera mitad.

(en realidad llama a win directamente)

servidor de programa1;

usa windows, winsock;

const myport=1414;/ /Predefinido puerto

{tipo

sockaddr_in = registro

caso Entero de

0: (sin_family: u_short;

sin_port: u_short;

sin_addr: TInAddr;

sin_zero: matriz[0..7] de Char);

1: (sa_family: u_short;

sa_data: matriz[0..13] de Char)

end;

TSockAddrIn = sockaddr_in;

PSOCKADDR = ^TSockAddr ;

TSockAddr = sockaddr_in;

WSAData = registro // !!! también WSDATA

wVersion: Word;

wHighVersion: Word ;

szDescripción: matriz[0..WSADESCRIPTION_LEN] de Char;

szSystemStatus: matriz[0..WSASYS_STATUS_LEN] de Char;

iMaxSockets: Word;

iMaxUdpDg: Palabra;

lpVendorInfo: PChar;

fin;

TWSAData = WSAData

fin;

}

var str: cadena;

s, ns: TSocket; //tipo: u_int|integer

ver: palabra;

rece: TWSAData; //tipo: WSAData;

wsstatus: entero; //winsocket_status; >

szd: matriz[0..WSADESCRIPTION_LEN] de Char;

szs: matriz[0..WSASYS_STATUS_LEN] de Char;

servidor: TSockAddr;/ /tpye: sockaddr_in

cliente: PSockAddr; //tipo: ^sockaddr_in

namelen: PInteger; //tipo: ^Integer;

buf: matriz[ 0.. 1023] de char;

comenzar

ver:=514;

escribir(\'WSAStartup = \');

intentar

wsstatus:=WSAStartup(ver,rece);

//Inicializar winsock; este es un proceso necesario en Windows

writeln(wsstatus);/

/estado de winsock, 0 representa el éxito

si wsstatus=0 entonces

comenzar

writeln;

writeln(\'*** ************************************************** * **************************\');

//A continuación se muestra el estado de winsock

write(\'wVersion = \');

writeln(rece.wVersion);

write(\'wHighVersion = \');

writeln (rece.wHighVersion);

write(\'iMaxSockets = \');

writeln(rece.iMaxSockets);

write(\ 'iMaxUdpDg = \');

writeln(rece.iMaxUdpDg);

writeln(\'szDescription es \');

para i:=0 a WSADESCRIPTION_LEN escriba(szd[i]);

writeln;

writeln(\'szSystemStatus is \');

para i:=0 a WSASYS_STATUS_LEN escribe (szs[i]);

writeln;

writeln(\'******************** ******** ******************************************* ********* *******\');

end;

escribir(\'socket = \');

s:=socket(AF_INET, SOCK_STREAM, 0);

//El primer paso es establecer el socket del servidor, 0 indica éxito

writeln(s);

si slt; 0 entonces salga;

write(\'bind = \');

server.sin_family:= AF_INET;

server.sin_port:= htons(mipuerto) ;

server.sin_addr.s_addr:= INADDR_ANY;

wsstatus:=bind(s, server, sizeof(server));

//Segundo paso, enlace, 0 indica éxito

writeln(wsstatus);

si wsstatuslt;gt;0 entonces salga;

write(\'listen = \ ');

wsstatus:=listen(s, 5);

//El tercer paso, escuchar

writeln (wsstatus);

si wsstatuslt;gt;0 entonces salir;

escribir(\'accept = \');

nuevo(cliente);

nuevo( nombrelen);

namelen^:=sizeof(client^);

ns:=accept(s, client, namelen);

//El cuarto paso, esperar la recepción

//Nota: ¡Cuando se pasa bind, se pasan los datos de la estructura sockaddr_in, y cuando se aceptan son dos punteros!

si ns=-1 entonces //Lo siguiente se puede convertir en un proceso multiproceso

comenzar

writeln(-1);

salir;

finalizar

else

comenzar

writeln(ns);

pktlen:=0

writeln(\'recv\'); /p>

repetir

p>

pktlen:= recv(ns,buf,1024,0); //Recibir datos

//pktlen= es la longitud de recepción, 0 significa desconexión, lt; 0 significa falla

sleep(1);

write(pktlen: 5);

si pktlengt; >

comenzar

i:=send(ns,buf,pktlen,0);//Devolver datos

end;

hasta pktlenlt;1 ;//Bucle hasta que el cliente se desconecte

end;

finalmente

writeln;

writeln(\'***** ********* ******************************************* ********** ****************\');

writeln(\'Presione para salir de winsocket\');

readln(str) ;

wsstatus:=WSACleanup(); //Salir de winsocket;

write(\'WSACleanup = \');

writeln(wsstatus);

end;

writeln;

writeln(\'Presione para salir\');

readln(cadena);

fin.