KEIL TCPNET localport

Başlatan mcan, 04 Kasım 2012, 13:40:34

mcan

Merhaba.
Keil TcpNet ile http client denemesi yapmak istiyorum bunun icin sunucuya baglanip istek gonderip cevap almak gerekiyor. Istek kismina kadar hallettim, yaptığımız isteğe cevap alabilmek için blli bir portu dinlemek gerekiyor sanırım.Bağlantı için kullandığımız fonksiyon, 
tcp_connect (tcp_soc, IPADR, 80, 0);
burada son argüman olan "0" sıradaki ilk müsait port numarasını lokal port olarak kullanmasını sağlıyor.
Soru şu ;
Bu şekilde bir bağlantı için lokal port numarasını elle vermemizde bir sıkıntı var mı? Keil üzerinde bu işin reconu nedir?
C# olsa
stm.Write(ba, 0, ba.Length); k = stm.Read(bb, 0, 8000);
gibi bir çözüm kullanabilirdik.
Header dosyalarını incelerken şu şekilde bir çözüm aklıma geldi
REMPORT = tcp_scb[tcp_soc].Remport
ancak bunu kullanabilmek için main içine bir sürü dosyayı tanıtmak gerekiyor. Bu arada keil in help dosyası ve kaynakları ne kadar da sığ anlatılmış. Çok dar bir anlatımları var.

Burak B

RL-ARM User's Guide şöyle diyor;
Tıkla
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

mcan

Alıntı yapılan: ByteMaster - 04 Kasım 2012, 14:08:16
RL-ARM User's Guide şöyle diyor;
Tıkla
O kısmı okudum ama bir yardımını göremedim. Http sunucusuna bağlanırken lokal portu elle girmenin bir dezavantajı varmı sorulardan biri bu.Elle girmesek bu sefer kullandığımız yapı yüzünden, sunucudan dönen http cevabını hangi portdan dinleyeceğiz? sorusu ortaya çıkıyor.

mcan

#3
keil tcpnet de tcp soketi kullaniyorum, soket tipi TCP_TYPE_CLIENT_SERVER , tcp_connect (tcp_soc, IPADR, 80, 0); ile baglanip requesti yolluyorum. Server tarafdan request basariyla alinip isleniyor cevap yollaniyor ancak
U16 tcp_callback (U8 soc, U8 event, U8 *ptr, U16 par) {
  /* This function is called on TCP event */
	switch (event) {
		case TCP_EVT_CONREQ:
      /* Remote host is trying to connect to our TCP socket. */
      /* 'ptr' points to Remote IP, 'par' holds the remote port. */
			printf("TCP_EVT_CONREQ\r\n");
      /* Return 1 to accept connection, or 0 to reject connection */
      return (1);
    case TCP_EVT_ABORT:
      /* Connection was aborted */
       printf("TCP_EVT_ABORT");
      break;
    case TCP_EVT_CONNECT:
      /* Socket is connected to remote peer. */
		 printf("TCP_EVT_CONNECT");
      break;
    case TCP_EVT_CLOSE:
      /* Connection has been closed */
			printf("TCP_EVT_CLOSE");
      break;
    case TCP_EVT_ACK:
      /* Our sent data has been acknowledged by remote peer */
			printf("TCP_EVT_ACK");
      break;
    case TCP_EVT_DATA:
      /* TCP data frame has been received, 'ptr' points to data */
      /* Data length is 'par' bytes */
			printf("TCP_EVT_DATA");
      break;
  }
	printf("\r\n");
	return (0);
}

Callback fonksiyonunda TCP_EVT_DATA yada  TCP_EVT_CONREQ hic gelmiyor. Bu sebeple datayi nasil alicaz anlayamadim.Acaba bsd soketmi kullansam .

Daha önce keil tcpnet kullanarak  tcp client socke tile ''http get request'' yapan oldu mu?

Yanlış yaptığım bir noktayı buldum tcp_send fonksiyonundan sonra aldığım TCP_EVT_ACK eventi sonrası soketi tcp_close (tcp_soc); ile kapatıyordum.Kapatmayınca gördüm ki kısa bir süre sonra TCP_EVT_DATA eventi de geliyor, yani gelen datayı alabiliyorum.Ancak TCP_EVT_DATA eventi ard arda 3 kere geliyor ve gelen data şu şekilde ;
TCP_EVT_DATA:HTTP/1.1 200 OK<CR><LF>
Date: Tue, 06 Nov 2012 17:52:07 GMT<CR><LF>
Server: Apache<CR><LF>
X-Powered-By: PHP/5.3.8<CR><LF>
Connection: close<CR><LF>
Transfer-Encoding: chunked<CR><LF>
Content-Type: text/html<CR><LF>
<CR><LF>
2<CR><LF>
Ok<CR><LF>
<CR><LF>
TCP_EVT_DATA:2<CR><LF>
Ok<CR><LF>
<CR><LF>
TCP_EVT_DATA:0<CR><LF>
<CR><LF>
<CR><LF>

Nedense gelen data yankı yapıyormus gibi azala azala tekrar tekrar geliyor. c# ile yaptığım işlemin aynısını yapıp aynı porttan aynı servere bağlandığımda gelen cevap şu şekilde ;
HTTP/1.1 200 OK<CR><LF>
Date: Tue, 06 Nov 2012 17:52:07 GMT<CR><LF>
Server: Apache<CR><LF>
X-Powered-By: PHP/5.3.8<CR><LF>
Connection: close<CR><LF>
Transfer-Encoding: chunked<CR><LF>
Content-Type: text/html<CR><LF>
<CR><LF>
2<CR><LF>
Ok<CR><LF>
<CR><LF>

Yani tekrar tekrar gelen bir data yok. Acaba her data aldıkdan sonra tcpnet fonksiyonlarından biri ile her aldığım datayı silmem yada discard etmem filanmı gerekiyor?

Windows c# tes koduma ard arda 3 kere receive eklediğimde gördümki tcpnet ile ne alıyorsam pc de de aynı şeyi alıyormuşum . Yani yukarıda c# ile aldığım sonuç eksikmiş... Peki server neden 3 kere aynı datayı azalta azalta yolluyor? Bu işin chunkd ile bir alakası varmıdır acaba?

Yazdıgım php kodunda bır yamukluk varmıs düzelttim yani server 2 kere yolluyormuş aynı datayı en sondaki 0 ın ise chunked ile alakalıymış dosyanın bittiğini söylüyor.