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.