Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Socket из другой программы

6.8K
24 апреля 2008 года
artemkaint
60 / / 12.07.2006
суть такова - пишу многопроцессный сервак (почему именно такой, а не многопоточный не спрашивайте)...соответственно написал "отца"...он конектится с клиентом...создает сына (другая прога - фактически запускает ее)..посылает ему сокет присоединенный..

результат нулевой - как только я посылаю сыну сокет (через соммандную строку тупо пересылаю 4-х байтовое число)...стараюсь воспринять в сыне это число как сокет...выдается ошибка 10038...типа нет сокета...
вопрос - вообще это реально? я так понимаю сокет возвращаемый процедурой accept - это адрес...соответственно к этому адресу можно примоединиться из любого места...хелп ми

вот тексты прог

"ПАПА"


#include "stdafx.h"
#define KOL 20
#define MAX_SIZE 1024
#define LEN_PR 13

using namespace std;
typedef struct
{
PROCESS_INFORMATION prInfo;
int time;
} suns;

int _tmain(int argc, _TCHAR* argv[])
{
SOCKET socket_Server, socket_Client;

int iSize;
int return_value;
WSADATA wsaData;
SOCKET client;
struct sockaddr_in server_address, client_address;
char send_string[128];


if ((return_value = WSAStartup(0x202,&wsaData)) != 0)
{
cout<<"WSAStartup failed with error "<<return_value<<endl;
WSACleanup();
return -1;
}

// Создание сокета
socket_Server = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
// Заполнение структуры localaddr типа sockaddr_in
server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_family = AF_INET;
server_address.sin_port = htons(CONNECT_PORT);

// Связывание адреса с переменной addr типа sockaddr_in
bind(socket_Server,(struct sockaddr*)&server_address,sizeof(server_address))

// Запуск прослушивания порта
listen(socket_Server, 1)
int i=0;
suns deti[KOL];

while (1)
{
iSize = sizeof(client_address);
// Прием соединения из очереди. Если его нет,
// то функция будет ожидать соединения клиента
socket_Client = accept(socket_Server,(struct sockaddr*)&client_address,&iSize);
STARTUPINFO cif;
ZeroMemory(&cif,sizeof(cif));
ZeroMemory(&deti.prInfo,sizeof(PROCESS_INFORMATION));
i++;
cif.cb=sizeof(cif);
TCHAR szCommandLine[128]=TEXT("C:\\suns.exe ");
int size,j;

TCHAR *p = szCommandLine;
p+= 12;
*p= (char)socket_Client + 1;
p++;
*p = (char)(socket_Client >> 8) + 1;
p++;
*p = (char)(socket_Client >> 16) + 1;
p++;
*p = (char)(socket_Client>> 24) + 1;
p++; *p='\0';
if (!CreateProcess(NULL,szCommandLine,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&cif,&deti.prInfo))
{
cout<<"CreateProcess ERROR - "<<GetLastError()<<endl;
break;
}
}
// Закрытие сокета после работы с потоком
iclosesocket(socket_Server);
getch();
WSACleanup();
return 0;

}

"СЫН"


int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
char send_string[128];

int ret;
ret = WSAStartup(0x202,&wsaData)
SOCKET Csocket;

unsigned int tmp = 0;
TCHAR *p = argv[1];
printf("%x\n",*p);
p+=3;

for (int i=0;i<4 ; i++)
{
tmp = tmp<<8;
tmp += ((char)*p) - 1;
p--;
}
Csocket = (SOCKET) tmp;
char szRecvBuff[1024];
ZeroMemory(&szRecvBuff,sizeof(szRecvBuff));

// Ждём приёма сообщения на сервер
ret = recv(Csocket,szRecvBuff,sizeof (szRecvBuff),0);
if (ret == SOCKET_ERROR)
printf("recv() failed: error %d\n",WSAGetLastError());
}

getch();
return 0;
}


P.S. может я вообще в теории не прав....
если есть более умный путь скажите пожалуйста
6.8K
24 апреля 2008 года
artemkaint
60 / / 12.07.2006
нашел что-то близкое - DuplicateHandle...кто-нить может работал - что делает конкретно? и покатит ли под мой случай?
6.8K
24 апреля 2008 года
artemkaint
60 / / 12.07.2006
прошу прощения нашел ответ на нашем форуме...
http://www.codenet.ru/progr/inet/socket_proc.php
только хотелось бы поподробнее узнать как это работает
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог