Socket


Socket

Defines an abstract concept by which two programs, possibly located in different computers, may exchange information using:
  • A communication protocol such as: HTTP, SMTP, FTP, POP3, IMAP, ...
  • A pair of addresses of the network protocol
  • A port number
  • .

Designa un concepto abstracto por el cual dos programas, posiblemente situados en computadoras distintas, pueden intercambiar información a través de:
  • Un protocolo de comunicaciones HTTP, SMTP, FTP, POP3, IMAP, ...
  • Un par de direcciones del protocolo de red
  • Un número de puerto
  • .

Internet Libraries

Some programmers prefer using Internet libraries instead of using sockets directly. Advanced programmers may use both sockets and Internet libraries. Some of these libraries are: Microsoft WinINet, Microsoft WinHTTP and CURL.
Algunos programadores prefieren usar las Librerías para Internet en lugar de usar los sockets directamente. Los programadores avanzados pueden usar los sockets y las Librerías para Internet. Algunas de estas librerías son: Microsoft WinINet, Microsoft WinHTTP y CURL.

Tip
Sockets are used in: Web Server, Internet Browser, Mobile Devices, Email clients, Email Server, SQL Server, SQL Clients, etc. They represent the most common mechanism to communicate two devices (or two programs) using the Internet.
Los sockets son usados en: Servidores Web, Exploradores de la Internet, Dispositivos Móviles, Clientes de correo electrónico, Servidor de Correo, Servidores de SQL, clientes de SQL, etc. Estos representan el mecanismo más común para comunicar dos dispositivos (o dos programas) usando la Internet.

Protocols and Ports

Every computer uses several protocols to access the services provided by the Internet as shown below:
  • HTTP (Hypertext Transfer Protocol) is used by the Web browser (Internet Explorer, Google Chrome, Firefox, ...) to communicate with a Web server that also uses HTTP. Most Web servers use port 80 to communicate with the Web browsers.
  • FTP (File Transfer Protocol) is used to move files from one computer to another. Most FTP clients such as Internet Explorer and WS FTP use port 21.
  • SMTP (Simple Mail Transfer Protocol) is used to send email. Email clients such as Outlook, Windows Live Mail or Thunderbird use port 25.
  • POP3 (Post Office Protocol 3) is used to retrieve email from a Mail server. Email clients such as Outlook or Windows Live Mail use port 110.
  • TELNET (Remote Terminal Access) is used for remote login and interactive access to remote servers using port 23.
  • IMAP (Internet Message Access Protocol) is used to provide access to email messages stored in a server in the Internet (Ports: 143, 220, 993).

  • HTTP (Hypertext Transfer Protocol)es usado por los exploradores de la Internet (Internet Explorer, Google Chrome, Firefox, ...) para comunicarse con un servidor Web que también usa el protocolo HTTP. La mayoría de los servidores Web usan el puerto 80 para comunicarse con el explorador.
  • FTP (File Transfer Protocol) es usado para mover archivos des una computadora a otra. La mayoría de los clientes de FTP tales como Internet Explorer y WS FTP usan el puerto 21.
  • SMTP (Simple Mail Transfer Protocol) es usado para enviar correo electrónico. Los clientes de correo electrónico tales como Outlook, Windows Live Mail o Thunderbird usan el puerto 25.
  • POP3 (Post Office Protocol 3)es usado para consultar el correo electrónico que está en un servidor de correo. Los clientes de correo electrónico tales como Outlook, Windows Live Mail o Thunderbird usan el puerto 110.
  • TELNET (Remote Terminal Access) es usado para conexión remota e interactiva con servidores remotos usando el puerto 23.
  • IMAP (Internet Message Access Protocol) es usado para dar acceso a mensajes de correo electrónico almacenados en servidor de Internet (Puertos: 143, 220, 993).

Winsock

A socket in Microsoft Windows is called Winsock, it
  • supports various protocols
  • is the best way to produce fast, close-to-the-hardware, transport code
  • is the only way to go when writing servers or when speed and efficiency of throughput are essential (more important than development time, for example)
  • provides more cross-platform support

Un socket en Microsoft Windows se llama Winsock, este
  • soporta varios protocolos
  • es la mejor forma de producir código rápido, cercano al hardware y al código de transporte
  • es la única forma de crear programas cuando se hacen programas en el servidor o cuando la velocidad y eficiencia son importantes (más importante que el tiempo de desarrollo, por ejemplo)
  • proporciona un mejor soporte entre diferentes plataformas

URL

A Uniform Resource Locator is used to identify and locate a resource in the Internet. An URL begins indicating the protocol used to access the resource as shown in the examples:

http://www.yahoo.com
file://C:\file.txt
ftp://ftp.ugto.mx
mailto:mike@hotmail.com
Un Localizador Uniforme de Recursos es usado para identificar y ubicar un recurso en la Internet. Un URL comienza indicando el protocolo usado para accesar el recurso como se muestra en los ejemplos:

http://www.yahoo.com
file://C:\file.txt
ftp://ftp.ugto.mx
mailto:mike@hotmail.com

URI

A uniform resource identifier (URI) is a string of characters used to identify a name of a web resource. A URL is special type of URI. You may search the Internet to know more about URIs.
Un Identificador Uniforme de Recursos (URI) es una cadena de caracteres usada para identificar un nombre de un recurso web. Un URL es un tipo especial de URI. Usted puede buscar la Internet para conocer más sobre los URIs.

Windows Ad Hoc Network in Windows XP

Server setup:
  1. Doble click the wireless network icon
  2. Properties tab
  3. Wireless networks
  4. Add
  5. Set the name of the network
  6. Set this network as an Ad Hoc network
  7. Client: with the right button of the mouse use the context menu to show the wireless networks and then connect to the previously created network

Configuración servidor:
  1. Doble clic en icono de conexiones inalámbricas
  2. Tab de Propiedades
  3. Redes Inalámbricas
  4. Agregar
  5. Fijar el nombre de la red
  6. Marcar esta es una red de Ad Hoc
  7. El cliente: con el mouse derecho en el menú de contexto mostrar redes inalámbricas y luego conectarse a la red creada.

Windows Ad Hoc Network in Windows 7 and 8

Server setup:
  1. Click on the wireless network icon
  2. Open the Network and Sharing Center
  3. Set up a new connection or network
  4. Set up a wireless ad hoc network
  5. Press the Next button twice
  6. Set the network name and set the security type to WEP
  7. Open the Network and Sharing Center
  8. Change advanced sharing settings
  9. In the Password protected sharing zone, select Turn off password protected sharing
Note: Ad hocs networks are not supported in Windows starter.
Nota: esto no funciona en la version Windows 7 starter Configuración servidor:
  1. Clic en icono de conexiones inalámbricas
  2. Centro de redes y recurso compartidos
  3. Configurar una nueva conexión a red
  4. Configurar una red inalámbrica Ad Hoc de equipo a equipo
  5. Presione el botón de siguiente dos veces
  6. Fije el nombre de la red y active el cifrado WEP
  7. Abra el Centro de Redes y Recursos Compartidos
  8. Cambiar configuración de uso compartido avanzado
  9. En la sección de Uso compartido con protección por contraseña, desactivar el uso compartido con protección con contraseña.
Nota: esto no funciona en la versión Windows 7 starter

Telnet

Telnet can be used to test connectivity when there are firewalls blocking some ports. To install telnet use: the Control Panel > Program and Features > Activate and Deactivate Windows Features. The example below tests connectivity to www.ugto.mx in port 80. From a DOS prompt command, you must use the code shown below. On the other hand, if you are using a telnet window, you must use open hostname port_number. See example below.
Telnet puede ser usado para probar conectividad cuando hay un firewall bloqueando algunos puertos. Para instalar telnet usar: el Panel de Control > Programas y sus Características > Activar y Desactivar características de Windows. El ejemplo de abajo prueba la conectividad a www.ugto.mx en el puerto 80. Desde el comando de CMD usted debe usar el comando se muestra debajo. Por otro lado, si usted abre una ventana de telnet use el comando open hostname port_number. Vea el ejemplo de abajo.

MSDOS: cmd.exe
telnet www.ugto.mx 80
GET / HTTP/1.0 PRESS ENTER TWICE


Winsok

The following code shows how to setup the stdafx.h file to use Winsock.
El código siguiente muestra cómo configurar el archivo stdafx.h para usar Winsock.

stdafx.h
...
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")


Sockets in Wintempla

In order to use sockets in Wintempla, you need to open the stdafx.h file and remove the comments from the line #define WIN_SOCKETS_SUPPORT as shown below. You must also edit the targetver.h file by commenting the lines corresponding to Windows XP (version 500) and by un-commenting the lines corresponding to Windows Vista (version 600).
Para usar los sockets en Wintempla, usted necesita abrir el archivo stdafx.h y remover los comentarios de la línea #define WIN_SOCKETS_SUPPORT como se muestra debajo. Usted debe de editar tambien le archivo targetver.h comentando las líneas correspondientes a Windows XP (version 500) y descomentando las líneas correspondientes a Windows Vista (version 600).

stdafx.h
...
//_________________________________________ OpenGL
//#define WIN_OPENGL_SUPPORT
//_________________________________________ Sockets
#define WIN_SOCKETS_SUPPORT
//_________________________________________ DirectX
//#define WIN_DIRECTX
//
...


Tip
To use a socket you must:
  1. The Client must Connect to a server socket using the IP address (or server name) and a port number
  2. The Client may Send some data, see figure below. The Server must Receive the data sent by the Client
  3. The Server may Send some data back to the Client. The Client must Receive the data send by the Server
For the socket to work properly, a Send operation in one end must be followed by a Receive operation in the other end. Even though, sockets allow contention, the protocol followed by the client and the server is usually synchronous, meaning that in most cases a protocol command on one end must wait for some sort of confirmation from the other end.
  1. El Cliente debe conectarse a un servidor socket usando la dirección de IP (o el nombre del servidor) y un número de puerto
  2. El Cliente puede Enviar (Send) datos, vea la figura de abajo. El Servidor debe Recibir (Receive) los datos enviados por el cliente
  3. El Servidor puede Enviar (Send) datos de regreso al Cliente. El Cliente debe Recibir (Receive) los datos enviados por el servidor
Para que el socket opere en forma apropiada, una operación Send en un extremo debe seguir de una operación Receive del otro lado. Aún, cuando los sockets permiten contención, el protocolo seguido por el cliente y el servidor es usualmente síncrono, así en la mayoría de los casos un comando del protocolo en un extremo debe esperar por algún tipo de confirmación desde el otro extremo.

socket

Tip
If you call Socket functions on the main thread, your program may be at times irresponsive. For clarity, the examples of this section will run on the main thread. However, if you are developing a professional application, you must create another thread to perform socket operations; this includes: Microsoft Windows, Linux, Android, etc.
Si usted llama funciones de Sockets en la thread principal, su programa se atorará a veces. Para claridad, los problemas de esta sección se ejecutarán en la thread principal. Sin embargo, si usted está desarrollando una aplicación profesional, usted debe crear otro thread para realizar operaciones con los sockets; esto incluye: Microsoft Windows, Linux, Android, etc.

TCP

It is the most commonly used protocol on the Internet. TCP is very reliable, that is, packets sent using TCP are tracked so that no data is lost or corrupted in transit. The following code shows how to create a TCP socket. As TCP is a stream protocol, the sender and receiver may break up data into smaller or larger groups.
Es el protocolo más comúnmente usado en la Internet. TCP es muy confiable, esto es, los paquetes enviados usando TCP son rastreados de tal forma que los datos no se pierden o se dañan cuando viajan. El código siguiente muestra cómo crear un socket para TCP. Como TCP es un protocolo de stream, el dispositivo que envía y el dispositivo que recibe pueden partir los datos en paquetes más pequeños o en grupos grandes.

Program.cpp
void Program::Window_Open(Win::Event& e)
{
     //____________________________________ 1. Initialize Winsock Version 2.2
     WSADATA wsaData;
     if (::WSAStartup(MAKEWORD(2, 2), & wsaData) != 0)
     {
          this->MessageBox(L"Unable to initialize Winsock", L"Program", MB_OK | MB_ICONERROR);
          return;
     }
     //____________________________________ 2. Create a TCP Socket
     SOCKET tcpSocket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// IPV4
     //SOCKET tcpSocket = ::socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); // IPV6
     if (tcpSocket == INVALID_SOCKET)
     {
          this->MessageBox(L"Unable to create socket", L"Program", MB_OK | MB_ICONERROR);
     }

     ...




     //____________________________________ 3. Uninitialize Winsock
     ::WSACleanup();
}


UDP

This protocol is similar to TCP, but it does not track the packages or check for errors. The sender does not wait for the recipient receives the packet; instead it just continues sending packets. UDP provides a faster communication than TCP. The following code shows how to create a UDP socket.
Este procolo es similar a TCP, pero los paquetes no son rastreados ni se checa por errores. El dispositivo que envia los datos no espera a que el receptor reciba los paquetes; en su lugar este sólo continua enviando paquetes. UDP proporciona una comunicación más rápida que TCP. El código siguiente muestra cómo crear un socket para UDP.

Program.cpp
void Program::Window_Open(Win::Event& e)
{
     //____________________________________ 1. Initialize Winsock Version 2.2
     WSADATA wsaData;
     if (::WSAStartup(MAKEWORD(2, 2), & wsaData) != 0)
     {
          this->MessageBox(L"Unable to initialize Winsock", L"Program", MB_OK | MB_ICONERROR);
          return;
     }
     //____________________________________ 2. Create a UDP Socket
     SOCKET udpSocket = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_TCP);// IPV4
     //SOCKET udpSocket = ::socket(AF_INET6, SOCK_DGRAM, IPPROTO_TCP); // IPV6
     if (udpSocket == INVALID_SOCKET)
     {
          this->MessageBox(L"Unable to create socket", L"Program", MB_OK | MB_ICONERROR);
     }

     ...




     //____________________________________ 3. Uninitialize Winsock
     ::WSACleanup();
}


Server Socket

A server program has a socket who listens for client sockets. A server program requires two sockets, one socket to listen (wait) for connections, and another one to handle the request (worker socket). The following code shows how to create a Server using sockets.
Un programa servidor tiene un socket que escucha por sockets clientes. Un programa servidor requiere dos sockets, un socket para escuchar (esperar) por conexiones, y otro socket para despachar la solicitud (socket trabajador). El código siguiente ilustra cómo crear un servidor usando sockets.

Program.h
void Program::Window_Open(Win::Event& e)
{
     //____________________________________ 1. Initialize Winsock Version 2.2
     WSADATA wsaData;
     if (::WSAStartup(MAKEWORD(2, 2), & wsaData) != 0)
     {
          this->MessageBox(L"Unable to initialize Winsock", L"Program", MB_OK | MB_ICONERROR);
          return;
     }
     //____________________________________ 2. Create the Server Socket
     SOCKET serverSocket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// IPV4
     //SOCKET serverSocket = ::socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); // IPV6
     if (serverSocket == INVALID_SOCKET)
     {
          this->MessageBox(L"Unable to create server socket", L"Program", MB_OK | MB_ICONERROR);
     }
     //____________________________________ 3. Bind the server socket to port 80
     SOCKADDR_IN serverAddress;
     serverAddress.sin_family = AF_INET;
     serverAddress.sin_port = htons(80);
     serverAddress.sin_addr.s_addr = htonl(INADDR_ANY);
     if (::bind(serverSocket, (SOCKADDR*)&serverAddress, sizeof(SOCKADDR_IN)) != 0)
     {
          this->MessageBox(L"Unable to bind to port", L"Program", MB_OK | MB_ICONERROR);
     }
     //____________________________________ 4. Accept a new connection when one arrives
     SOCKADDR_IN clientAddress;
     int clientAddressLen = sizeof(SOCKADDR_IN);
     SOCKET workerSocket = ::accept(serverSocket, (SOCKADDR*)&clientAddress, &clientAddressLen);
     ...

     //____________________________________ 5. Close sockets
     ::closesocket(workerSocket);
     ::closesocket(serverSocket);
     //____________________________________ 6. Uninitialize Winsock
     ::WSACleanup();
}


Client Socket

A client program requires the remote IP address of the server and the port number. The following code shows a basic client program.
Una programa cliente requiere la dirección IP remota del servidor y el número de puerto. El código siguiente muestra un programa básico cliente.

Program.cpp
void Program::Window_Open(Win::Event& e)
{
     //____________________________________ 1. Initialize Winsock Version 2.2
     WSADATA wsaData;
     if (::WSAStartup(MAKEWORD(2, 2), & wsaData) != 0)
     {
          this->MessageBox(L"Unable to initialize Winsock", L"Program", MB_OK | MB_ICONERROR);
          return;
     }
     //____________________________________ 2. Create the Client Socket
     SOCKET clientSocket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// IPV4
                                                                                      //SOCKET clientSocket = ::socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); // IPV6
     if (clientSocket == INVALID_SOCKET)
     {
          this->MessageBox(L"Unable to create client socket", L"Program", MB_OK | MB_ICONERROR);
     }
     //____________________________________ 3. Connect to the server
     SOCKADDR_IN serverAddress;
     serverAddress.sin_family = AF_INET;
     serverAddress.sin_port = htons(80);
     serverAddress.sin_addr.s_addr = inet_addr("136.149.3.29");
     if (::connect(clientSocket, (SOCKADDR *)&serverAddress, sizeof(SOCKADDR_IN)) != 0)
     {
          this->MessageBox(L"Unable to connect to server", L"Program", MB_OK | MB_ICONERROR);
     }
     //____________________________________ 4. Send some data
     char buffer[2048];
     int bytesToSend = 2048;
     int remainingBytes = bytesToSend;
     size_t position = 0;
     int result;

     while (remainingBytes > 0)
     {
          result = ::send(clientSocket, &buffer[position], remainingBytes, 0);
          if (result == SOCKET_ERROR)
          {
               // ERROR
          }
          remainingBytes -= result;
          position += result;
     }
     //____________________________________ 5. Close client socket
     ::closesocket(clientSocket);
     //_____________________________________ 6. Uninitialize Winsock
     ::WSACleanup();
}

© Copyright 2000-2019 Wintempla selo. All Rights Reserved. Sep 05 2019. Home