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 ;

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

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

iMaxSockets: Word;

iMaxUdpDg: Word;

lpVendorInfo: PChar;

end;

TWSAData = WSAData;

fin

}

var str:string;

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

ver: palabra;

rece:TWSAData;//type:WSAData;

wsstatus:integer;//winsocket_status;

i,pktlen:integer

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

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

servidor:TSockAddr;/ /tpye: sockaddr_in

cliente:PSockAddr;//tipo:^sockaddr_in

namelen:PInteger;//tipo:^Integer;

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

comenzar

ver:=514;

escribir(\'WSAStartup = \');

intentar

wsstatus:=WSAStartup(ver,rece);

//Inicializar winsock; un proceso necesario en Windows

writeln(wsstatus) ;//estado de winsock , 0 representa el éxito

si wsstatus=0 entonces

comenzar

writeln;

writeln(\'* ***** *************

************************************************** * ***************\');

//El estado de winsock se muestra a continuación

write(\'wVersion = \' );

writeln(rece.wVersion);

write(\'wHighVersion = \');

writeln(rece.wHighVersion);

write(\'iMaxSockets = \');

writeln(rece.iMaxSockets);

write(\'iMaxUdpDg = \');

writeln (rece.iMaxUdpDg);

writeln(\'szDescription is \');

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

writeln;

writeln(\'szSystemStatus es \');

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

escribir;

escribir(\'********************************* ******** ******************************************* ***\');

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 s<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));

//El segundo paso es vinculante , 0 significa éxito

writeln(wsstatus);

si wsstatus<>0 entonces salga;

write(\'listen = \');

wsstatus:= listening(s,5);

//El tercer paso, escuchar

writeln(wsstatus);

if wsstatus <>0 y luego salir;

p>

escribir(\'accept = \');

nuevo(cliente);

nuevo(namelen);

namelen^:= sizeof(client^);

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

//El cuarto paso, esperar recepción

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

if ns=-1 luego // Lo siguiente se puede convertir en un proceso multiproceso

comenzar

writeln(-1)

;

salir;

finalizar

otro

comenzar

escribir(ns);

pktlen:=0;

escribir(\'recv\');

repetir

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

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

sleep(1);

escribir(pktlen:5);

si pktlen>0 entonces

comenzar

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

end;

hasta pktlen<1;//Bucle hasta que el cliente se desconecte

end;

finalmente

escribir;

escribir(\'********************************* *** ************************************************* **\ ');

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

readln(str);

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

write(\'WSACleanup = \');

writeln(wsstatus);

end;

writeln;

writeln(\'Presione para salir\');

readln(str);

end.