[C con Clase] sockets send() con el cable desconectado
nree
p_westermani en hotmail.com
Mie Feb 6 18:26:49 CET 2008
Pues como dice el asunto del mensaje, creo un socket y a pesar de que en el servidor el cable de red este desconectado no da error, sigue aceptando cadenas de caracteres sin dar ningun tipo de error, cuando vuelvo a conectar el cable de red en el sevidor aparecen los datos por ahi, alguna idea?? no se supone que send() devuelve los caracteres que ha enviado?? pero si esta el cable desconectado como puede enviarlos???
cualquier sugerencia sera bien recibida, os dejo el codigo del cliente
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#define TAMBUF 1460
#define PORT 1064
void limpiar_buffer(char *buffer)
{
for (int i=0; i<TAMBUF; i++)
buffer[i]='\0';
}
int main(int argc, char *argv[]) {
WSADATA wsaData;
int sock,i,one=1, result;
struct sockaddr_in dir_serv;
char buf[TAMBUF];
fd_set writeset;
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
{
puts("WSAStartup fallo");
return 1;
}
sock = socket(PF_INET, SOCK_STREAM, 0);
if(sock < 0)
{
perror("no se ha podido crear el socket");
exit(1);
}else
puts("socket creado");
/*setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,(char *) &one,sizeof(one));
int flag = 1;
result = setsockopt(sock,IPPROTO_TCP, TCP_NODELAY,(char *) &flag, sizeof(int));
if (result < 0)
perror("error del TCP_NODELAY");*/
memset(dir_serv.sin_zero, '\0',sizeof dir_serv.sin_zero);
dir_serv.sin_family = AF_INET;
dir_serv.sin_port = htons(PORT);
dir_serv.sin_addr.s_addr = inet_addr("192.168.1.15");
//dir_serv.sin_addr.s_addr =inet_addr(argv[1]);
if (connect (sock, (struct sockaddr*)&dir_serv, sizeof dir_serv) < 0)
{
perror("conexión no aceptada");
exit(1);
}else
puts("conectando con el servidor");
FD_ZERO(&writeset);
FD_SET(sock, &writeset);
while(1)
{
/*result = select(sock + 1, NULL, &writeset, NULL, NULL);
if (result < 0)
{
perror("error en el select");
exit(1);
}
if (FD_ISSET(sock, &writeset))
{*/
gets(buf);
i = send(sock, buf,(int)strlen(buf),0);
if (i < (int)strlen(buf))
{
perror("error en la escritura");
exit(1);
}
if (strcmp(buf,"exit") == 0)
{
printf("desconexión...\n");
closesocket(sock);
exit(1);
}
limpiar_buffer(buf);
//}
}
}
Más información sobre la lista de distribución Cconclase