|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
17.05.2011, 11:26 | #1 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Определить свой порт методом WinSocket
У меня есть моя программа клиента SIP написанная на Delphi с использованием Winsocket. Подскажите кто нибудь как в запросе подставить порт который открыла моя программа для принятия данных
пример Via: SIP/2.0/UDP 127.0.0.1:nnn-тут нужен порт моей программы, а то он у меня подставляет порт запроса сервера 5060, по сниферу я вижу какой порт открыт но WinSocket дает порт подключения, а не открытый порт, как я понимаю нужно к своей программе дописать и снифер который и даст мне этот порт затем его отправить в запросе? |
17.05.2011, 11:28 | #2 |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
где код вашего тестового проекта?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation |
17.05.2011, 11:32 | #3 |
Форумчанин
Регистрация: 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; |
17.05.2011, 11:34 | #4 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Все работает только порт 5060 выдает Я написал где пытаюсь определить порт
|
17.05.2011, 11:52 | #5 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Из кода выдает такое значения
FPORT:=5060 А дальше выдает так Via: SIP/2.0/UDP 127.0.0.1:FPORT |
17.05.2011, 11:55 | #6 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Вовану большое спасибо за часть кода, собран на его примерах в форумах.
|
17.05.2011, 12:34 | #7 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Немного разобрался. У меня только получается принятие данных с сервера таким образом. запускаю 2 UDP сокета, на одном порт 5060 на другом 1111 , запроса Via: SIP/2.0/UDP 127.0.0.1:1111 тогда на второй клиент приходит ответ, можно ли все это с без второго сокета делать?
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа 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 |