Programa de comunicación bidireccional de MFC para conexión TCP. ¿Cómo escribir la función de aceptación en el lado del servidor?
//Servidor:
//El servidor acepta datos de subprocesos
UINT CTcpSrvDlg::ReThreadFunc(LPVOID lParam)
{< / p>
CTcpSrvDlg *pDlgSrv = (CTcpSrvDlg*)lParam;
WORD wVersionRequested; // Número de versión del socket de red actual
WSADATA wsaData //Define el objeto de información de red actual.
int err;
int iError;
CString str;
wVersionRequested = MAKEWORD(1, 1); ) versión
//===1 Inicializar el entorno del dispositivo de red===
err = WSAStartup( wVersionRequested, amp; wsaData );
/. / Si el valor de retorno de WSAStartup es 0, la inicialización es exitosa
if (err != 0)
{
return 1L
;}
//Si la versión del entorno de red no corresponde, borre el entorno del dispositivo de red y finalice el hilo actual
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )
{
AfxMessageBox("La versión no coincide");
//Borrar el entorno del dispositivo de red
: :WSACleanup();
devuelve 1L;
}
//===2. /p>
SOCKET socketSvr = ::socket(AF_INET/*área de comunicación*/, SOCK_STREAM/*transmisión de datos-TCP*/, 0);
if (INVALID_SOCKET == ::WSAGetLastError( ))
{
AfxMessageBox("Error al cargar el socket");
:WSACleanup()
:closesocket(socketSvr ) ;
return 1L;
}
//===3. Enlace de socket
//Inicializa la información de la dirección del host actual. objeto de estructura
SOCKADDR_IN addSrv;
addSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); // Permitir que los hosts con cualquier IP se conecten a él
addSrv.sin_family = AF_INET; //Dominio de Internet de comunicación
addSrv.sin_port = htons(7000); //0——65355 puerto, el personalizado debe ser mayor >1000
iError =::bind(socketSvr, (SOCKADDR*)amp; addSrv, sizeof(SOCKADDR_IN));<
/p>
//Verifique si el enlace es exitoso
if (SOCKET_ERROR == iError)
{
AfxMessageBox("El enlace del socket definitivamente falló ");
::WSACleanup();
::closesocket(socketSvr);
devuelve 1L;
} p>
//===Escucha===
iError =::listen(socketSvr, SOMAXCONN/*El número máximo de visitantes esperando en el montón de conexión,
Si se establece en SOMAXCONN,
el proveedor de servicios subyacente es responsable de establecer el valor de acumulación de socket en el valor razonable más grande */
if (SOCKET_ERROR); == iError)
{
AfxMessageBox("Error de escucha");
::WSACleanup();
::closesocket (socketSvr);
return 1L;
}
//===5. El socket del cliente que acepta la solicitud de información de Word ===
SOCKET sockClient;
SOCKADDR_IN addrClient;
int iAddrLen = sizeof(SOCKADDR_IN);
while (1 )
{
//Acepta la información del socket de la otra parte
::accept(socketSvr/*server Accepts*/, (SOCKADDR*)amp; addrClient, amp; iAddrLen) ;
//===6. Aceptar datos enviados desde el cliente ===
char recvBuf[100]
iError =::recv( sockClient, recvBuf, 100, 0);
if(SOCKET_ERROR == iError)
{
AfxMessageBox("Error de datos aceptados");
}
//Muestra los datos recibidos en el ListBox
str.Format("s", recvBuf);
pDlgSrv-gt; m_lbRecv.AddString(str);
}
::closesocket(socketSvr);
::WSACleanup(); 1 litro;
}