¿Problema con la función recvfrom de programación de red VC++?
Ya que me diste los puntos, debería ayudarte a resolverlo. Esta es una sala de chat simple que se puede usar después de la prueba. Por favor, eche un vistazo al código fuente. Programa del lado del servidor:
1. Cree un socket.
2. Vincular el socket a la dirección y al puerto local (vincular).
3. Esperando recibir datos (recvfrom).
4. Cerrar el enchufe.
#include
#include
#include
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
//Solicita la versión del socket
wVersionRequested = MAKEWORD(1, 1); //Utiliza la macro MAKEWORD para solicitar la versión 1.1 de la biblioteca Winsock
err = WSAStartup( wVersionRequested, &wsaData ); //Carga el conjunto de bytes y determina la versión que se utilizará
if ( err != 0 )
{
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) ! = 1 ) // ¿El byte bajo y el alto es el byte 1?
{
WSACleanup( ); // Terminar el uso de la biblioteca Winsock
return 0;
}
//Crear un socket
SOCKET sock=socket(AF_INET,SOCK_DGRAM,0); //Definir un calcetín para recibir el retorno. socket
//Definir una estructura de dirección
SOCKADDR_IN ip;
ip.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //IP, o usar ip.sin_addr.S_un .S_addr=inet_addr("127.0.0.1");
ip.sin_family=AF_INET; //Especificar familia de direcciones
ip.sin_port=htons(8888) ; //Puerto/ /Enlazar socket
bind(sock,(SOCKADDR*)&ip,sizeof(SOCKADDR)); //Enviar datos
char recvbuf [100 ]; //Aceptar datos
char temp[200]; //Otros usos SOCKADDR_IN client; //Se utiliza para aceptar la información de la dirección del cliente
int len=sizeof(SOCKADDR) ); //Longitud
while(true)
{
//Aceptar datos
recvfrom(sock,recvbuf,100, 0, (SOCKADDR*)&cliente,&len);
if(strcmp("out",recvbuf)==0)
{
sendto(sock ," out",sizeof("out")+1,0,(SOCKADDR*)&client,len); //La dirección se obtuvo cuando llamamos a recvfrom
cout&.
lt;<"El programa cliente ha salido y el chat ha finalizado\n";
break;
}
sprintf(temp,"La IP pertenece a %s La gente dice: %s",inet_ntoa(client.sin_addr),recvbuf);
cout< cin.getline(sendbuf,100 ); p> sendto(sock,sendbuf,sizeof(sendbuf)+1,0,(SOCKADDR*)&client,len); } closesocket(calcetín); WSACleanup(); devuelve 0; } ------ --------- - Programa cliente: 1. 2. Enviar datos al servidor (sendto). 3. Cerrar el enchufe. #include #include #include int main() { WORD wVersionRequested; WSADATA wsaData; int err; //Solicita la versión del socket wVersionRequested = MAKEWORD(1, 1); //Utiliza la macro MAKEWORD para solicitar la versión 1.1 de la biblioteca Winsock err = WSAStartup( wVersionRequested, &wsaData ); //Carga el conjunto de bytes y determina la versión que se utilizará if ( err != 0 ) { return 0; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) ! = 1 ) // ¿El byte bajo y el alto es el byte 1? { WSACleanup( ); // Terminar el uso de la biblioteca Winsock return 0; } //Crear socket SOCKET sock=socket(AF_INET,SOCK_DGRAM,0); //Enviar datos SOCKADDR_IN fuwuqi; fuwuqi.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); fuwuqi.sin_family=AF_INET; fuwuqi. sin_port=htons(8888); char sendbuf[100]; char recvbuf[100]; char temp[200]; int len=sizeof( SOCKADDR); while(true) { cout<<"Por favor, ingresa lo que quieres decir\n "; cin.getline(sendbuf,100); sendto(sock,sendbuf,sizeof(sendbuf)+1,0,(SOCKADDR*)&fuwuqi,len); recvfrom(sock ,recvbuf,100,0,(SOCKADDR*)&fuwuqi,&len); if(strcmp(recvbuf,"out")==0) { cout<<"Salida del programa\n"; pausa; } sprintf(temp," El servidor %s dijo: %s", inet_ntoa(fuwuqi.sin_addr),recvbuf); cout< } closesocket (calcetín); WSACleanup(); }< /p>