Socket |
Defines an abstract concept by which two programs, possibly located in different computers, may exchange information using:
Designa un concepto abstracto por el cual dos programas, posiblemente situados en computadoras distintas, pueden intercambiar información a través de:
|
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:
|
Winsock |
A socket in Microsoft Windows is called Winsock, it
Un socket en Microsoft Windows se llama Winsock, este
|
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:
Configuración servidor:
|
Windows Ad Hoc Network in Windows 7 and 8 |
Server setup:
Nota: esto no funciona en la version Windows 7 starter Configuración servidor:
|
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 or pch.h file to use Winsock. El código siguiente muestra cómo configurar el archivo stdafx.h o el archivo pch.h para usar Winsock. |
stdafx.h |
. . . #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") |
pch.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). In new versions of Microsoft Visual Studio, you will use the pch.h file (Pre Compiled Header) instead of the stdafx.h file. 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). En nuevas de Microsoft Studio, usted encontrará el archivo pch.h (Pre Compiled Header) en lugar del archivo stdafx.h. |
stdafx.h |
. . . //_________________________________________ OpenGL //#define WIN_OPENGL_SUPPORT //_________________________________________ Sockets #define WIN_SOCKETS_SUPPORT //_________________________________________ DirectX //#define WIN_DIRECTX // . . . |
Tip |
To use a socket you must:
|
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. Examples of programs using server sockets are: Microsoft IIS, Apache HTTP Server, MySQL, Microsoft SQL Server, Oracle Database, etc. 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. Ejemplos de programas usando sockets servidores: Microsoft IIS, Apache HTTP Server, MySQL, Microsoft SQL Server, Oracle Database, etc. |
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. Examples of programs using client sockets are: Microsoft Edge, Google Chrome, Safari, FireFox, Opera, MySQL Workbench, Microsoft Teams, Microsoft Outlook, One Drive, Google Drive, WhatsApp, etc. 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. Ejemplos de programas usando sockets de cliente: Microsoft Edge, Google Chrome, Safari, FireFox, Opera, MySQL Workbench, Microsoft Teams, Microsoft Outlook, One Drive, Google Drive, WhatsApp, etc. |
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(); } |
Problem 1 |
How to decide when to use a server socket server and client socket? (a) Google Search Engine (b) Google Chrome, (c) Microsoft Exchange, (d) Microsoft Outlook, (e) Thunderbird, (f) Facebook mobile application, (g) WhatsApp for Android. Como decidir cuando usar un socket servidor y un socket cliente? (a) Google Search Engine (b) Google Chrome, (c) Microsoft Exchange, (d) Microsoft Outlook, (e) Thunderbird, (f) Aplicación movil de Facebook, (g) WhatsApp para Android. |
Problem 2 |
How to decide when to use TCP o UDP? (a) A video game, (b) A program to transmit 3D video, (c) A program to connect to a data base. Como decidir cuando usar TCP o UDP? (a) Un video juego, (b) Un programa para transmitir video en 3D, (c) Un programa para acceder una base de datos. |