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]); p>
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); p>
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 = \'); p>
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.