C socket siempre me devuelve -1 [Winsock]
El problema de este post es que al momento de programar un miniservidor WEB
Este me marcaba lo siguiente:
Valor -1
socket: No error
El codigo de prueba es:
#include<winsock2.h>
#include<stdio.h>
#include<errno.h>
int main() {
int s;
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("Valor %i\n",s);
perror("socket");
return 1;
}
}
Se compila de la siguiente manera:
gcc -o test.exe test.c -lws2_32
Al parecer los pendejos de Micro$oft siempre saliendose de lo estandar para poder utilizar socket, necesitas inicializar el Winsock de la siguiente manera.
#include<winsock2.h>
#include<stdio.h>
#include<errno.h>
WSADATA *wsaData;
int main() {
int s,iResult;
wsaData = calloc(1,sizeof(WSADATA));
iResult = WSAStartup(MAKEWORD(2,2), wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("Valor %i\n",s);
perror("socket");
return 1;
}
}
Con lo cual el codigo ya no marca error y podremos continuar con las funciones clasicas para realizar bind, listen y connect
Posiblemente tambien se encuentre con la sorpresa de que el Socket devuelto por connect no es un FileDescriptor normal, si no uno de windows al cual no se le puede realizar fdopen y operaciones con read and write.
Saludos
Este me marcaba lo siguiente:
Valor -1
socket: No error
El codigo de prueba es:
#include<winsock2.h>
#include<stdio.h>
#include<errno.h>
int main() {
int s;
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("Valor %i\n",s);
perror("socket");
return 1;
}
}
Se compila de la siguiente manera:
gcc -o test.exe test.c -lws2_32
Al parecer los pendejos de Micro$oft siempre saliendose de lo estandar para poder utilizar socket, necesitas inicializar el Winsock de la siguiente manera.
#include<winsock2.h>
#include<stdio.h>
#include<errno.h>
WSADATA *wsaData;
int main() {
int s,iResult;
wsaData = calloc(1,sizeof(WSADATA));
iResult = WSAStartup(MAKEWORD(2,2), wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("Valor %i\n",s);
perror("socket");
return 1;
}
}
Con lo cual el codigo ya no marca error y podremos continuar con las funciones clasicas para realizar bind, listen y connect
Posiblemente tambien se encuentre con la sorpresa de que el Socket devuelto por connect no es un FileDescriptor normal, si no uno de windows al cual no se le puede realizar fdopen y operaciones con read and write.
Saludos
Comentarios