Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2011, 11:26   #1
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию Определить свой порт методом WinSocket

У меня есть моя программа клиента SIP написанная на Delphi с использованием Winsocket. Подскажите кто нибудь как в запросе подставить порт который открыла моя программа для принятия данных
пример Via: SIP/2.0/UDP 127.0.0.1:nnn-тут нужен порт моей программы, а то он у меня подставляет порт запроса сервера 5060, по сниферу я вижу какой порт открыт но WinSocket дает порт подключения, а не открытый порт, как я понимаю нужно к своей программе дописать и снифер который и даст мне этот порт затем его отправить в запросе?
Aliens_wolfs вне форума Ответить с цитированием
Старый 17.05.2011, 11:28   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

где код вашего тестового проекта?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 17.05.2011, 11:32   #3
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Вот пример


procedure TSocketClient.Execute;
var
sin, clsin : sockaddr_in;
FDSet: TFDSet;
TimeVal: TTimeVal;
Buf: Pointer;
Size, iSize: Integer;
IP: Integer;
begin

if FProtokol=0 then
FSocket := WinSock.socket(AF_INET, SOCK_STREAM, 0)
else
FSocket := WinSock.socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

if (FSocket = INVALID_SOCKET) then
begin
if not Terminated then
begin
FLastError := WSAGetLastError;
Synchronize(OnError);
end;
Exit;
end;

IP := HostResolve(FHost);
if (DWORD(IP) = DWORD(INADDR_NONE)) then
begin
if not Terminated then
begin
FLastError := WSAGetLastError;
Synchronize(OnError);
end;
Exit;
end;

sin.sin_family := AF_INET;
sin.sin_addr.S_addr := IP;
sin.sin_port := htons(FPort);
clsin:=sin;
if (WinSock.connect(FSocket, sin, SizeOf(sin)) = SOCKET_ERROR) then
begin
if not Terminated then
begin
FLastError := WSAGetLastError;
Synchronize(OnError);
end;
Exit;
end;

Synchronize(OnConnect);

while not Terminated do
begin
FD_ZERO(FDSet);
FD_SET(FSocket, FDSet);
TimeVal.tv_sec := 0;
TimeVal.tv_usec := 10;
if (select(0, @FDSet, NIL, NIL, @TimeVal) < 1) then
begin
while not Terminated do
begin
Size := FBuffer.GetSize;
if (Size = 0) then
Break;
GetMem(Buf, Size);
FBuffer.Enter;
FBuffer.Get(Buf^, Size, Size);
FBuffer.Leave;
if FProtokol=0 then
Size := WinSock.send(FSocket, Buf^, Size, 0)
else
Size := WinSock.sendto(FSocket, Buf^, Size, 0, clsin, sizeof(clsin));
FreeMem(Buf);
/////здесь пытаюсь определить
FHost:=inet_ntoa(clsin.sin_addr);
FPort:=htons(clsin.sin_port);
if (Size = SOCKET_ERROR) and not Terminated then
begin
FLastError := WSAGetLastError;
Synchronize(OnError);
Exit;
end;
FBuffer.Enter;
if FBuffer.Skip(Size) then
FBuffer.Delete;
FBuffer.Leave;
FBufSize := Size;
if (FBufSize > 0) then
Synchronize(OnSending);
end;
end else
begin
ioctlsocket(FSocket, FIONREAD, Size);
if (Size = 0) and not Terminated then
begin
Synchronize(Disconnect);
Exit;
end;
GetMem(Buf, Size);
if FProtokol=0 then
Size := WinSock.recv(FSocket, Buf^, Size, 0)
else
Size := WinSock.recvfrom(FSocket, Buf^, Size, 0, clsin, iSize);
FHost:=inet_ntoa(clsin.sin_addr);
FPort:=htons(clsin.sin_port);
if not Terminated then
begin
if (Size = SOCKET_ERROR) then
begin
FreeMem(Buf);
FLastError := WSAGetLastError;
if ((FLastError = WSAECONNRESET) or (FLastError = WSAECONNABORTED)) then
begin
Synchronize(Disconnect);
Exit;
end;
Synchronize(OnError);
Exit;
end;
FBuf := Buf;
FBufSize := Size;
Synchronize(OnReceive);
FBuf:=nil;
end;
FreeMem(Buf);
end;
end;
Synchronize(Disconnect);
end;
Aliens_wolfs вне форума Ответить с цитированием
Старый 17.05.2011, 11:34   #4
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Все работает только порт 5060 выдает Я написал где пытаюсь определить порт
Aliens_wolfs вне форума Ответить с цитированием
Старый 17.05.2011, 11:52   #5
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Из кода выдает такое значения
FPORT:=5060
А дальше выдает так Via: SIP/2.0/UDP 127.0.0.1:FPORT
Aliens_wolfs вне форума Ответить с цитированием
Старый 17.05.2011, 11:55   #6
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Вовану большое спасибо за часть кода, собран на его примерах в форумах.
Aliens_wolfs вне форума Ответить с цитированием
Старый 17.05.2011, 12:34   #7
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Немного разобрался. У меня только получается принятие данных с сервера таким образом. запускаю 2 UDP сокета, на одном порт 5060 на другом 1111 , запроса Via: SIP/2.0/UDP 127.0.0.1:1111 тогда на второй клиент приходит ответ, можно ли все это с без второго сокета делать?
Aliens_wolfs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа c WinSocket alexprey Работа с сетью в Delphi 0 25.11.2010 17:41
Определить корень уравнения методом Ньютона VNS Помощь студентам 0 02.12.2009 14:35
Как определить Свой ip адрес! Marsik Помощь студентам 4 10.04.2008 20:41