PDA

View Full Version : Giúp đỡ về mở 2 Socket chạy song song với TCPIP Stack


honghoan
04-08-2011, 06:11 PM
Chào các anh chị, em đang gặp sự cố khi mở 2 socket chạy cùng lúc với nhau, mở Socket này, thì không mở được cái còn lại.
Em dùng TCPIP Stack của Microchip cung cấp, dùng ok nếu chỉ mở 1 Socket. Mở 2 socket thì cái mở trước chạy ok, Socket còn lại không thể mở được.

Socket 1 em khai báo:
static BYTE ServerNamePC[] = "192.168.1.5";
static WORD ServerPortPC = 5000;

Socket 2:
static BYTE ServerName[] = "192.168.1.199";
static WORD ServerPort = 9100;
//Defines the port to be accessed for this application

Em mở socket 1 đầu bằng lệnh:

MySocketPC = TCPOpen((DWORD)&ServerNamePC, TCP_OPEN_RAM_HOST, ServerPortPC, TCP_PURPOSE_GENERIC_TCP_CLIENT);

Socket 2:

MySocket = TCPOpen((DWORD)&ServerName,TCP_OPEN_RAM_HOST,ServerPort,TCP_PURPOS E_GENERIC_TCP_CLIENT);

Kết quả Socket nào mở trước thì chạy tốt, và không mở được socket thứ 2.
Nhờ anh chị nào đã từng dùng TCPIP Stack rồi, chỉ giúp em. Tìm hoài mà không ra chỗ nào để chỉnh, nản quá.
Cảm ơn các anh chị nhiều.!

tanbka
05-08-2011, 12:22 AM
Cái này là do khi mở Socket, bạn phải khai báo địa chỉ đích,ở đây bạn mở 2 socket để kết nỗi với 2 thiết bị khác nhau &ServerNamePC và &ServerName. Trong địa chỉ đích, không những có địa chỉ IP mà còn phải có cả địa chỉ MAC nữa.
Nếu không khai báo địa chỉ MAC thì PIC sẽ lấy địa chỉ MAC mà nó thu được khi quá trình kết nối thành công với 1 PC bên ngoài. Vì thế bạn sẽ chỉ kết nối được với 1 PC bên ngoài.
Bạn dùng lệnh này để lấy địa chỉ MAC của PC tương ứng với địa chỉ IP của nó nhé
ARPResolve(&server_info.IPAddr); lệnh này để gửi yêu cầu trả về địa chỉ MAC
Sau khoảng 1s kiểm tra điều kiện
if(ARPIsResolved(&server_info.IPAddr, &server_info.MACAddr)); nếu điều kiện đúng, tức là ta đã có địa chỉ MAC.
Khi đó bạn mở Socket thì đã có thông tin chính xác của địa chỉ đích tới, thông tin dữ liệu hoàn toàn do mình điều khiển.
Chúc bạn thành công.

honghoan
05-08-2011, 09:34 AM
Cảm ơn bạn nhiều !! Để mình thử xem, mong rằng chạy được. Mấy bữa nay chỉnh quá trời mà vẫn không chạy, có hướng đi mừng quá

honghoan
08-08-2011, 01:03 PM
Cái này là do khi mở Socket, bạn phải khai báo địa chỉ đích,ở đây bạn mở 2 socket để kết nỗi với 2 thiết bị khác nhau &ServerNamePC và &ServerName. Trong địa chỉ đích, không những có địa chỉ IP mà còn phải có cả địa chỉ MAC nữa.
Nếu không khai báo địa chỉ MAC thì PIC sẽ lấy địa chỉ MAC mà nó thu được khi quá trình kết nối thành công với 1 PC bên ngoài. Vì thế bạn sẽ chỉ kết nối được với 1 PC bên ngoài.
Bạn dùng lệnh này để lấy địa chỉ MAC của PC tương ứng với địa chỉ IP của nó nhé
ARPResolve(&server_info.IPAddr); lệnh này để gửi yêu cầu trả về địa chỉ MAC
Sau khoảng 1s kiểm tra điều kiện
if(ARPIsResolved(&server_info.IPAddr, &server_info.MACAddr)); nếu điều kiện đúng, tức là ta đã có địa chỉ MAC.
Khi đó bạn mở Socket thì đã có thông tin chính xác của địa chỉ đích tới, thông tin dữ liệu hoàn toàn do mình điều khiển.
Chúc bạn thành công.

Mình đã nghiên cứu lại cái ARP và tiến hành thử như cách của bạn nói và thử nhiều cách khác với cái ARP nữa nhưng vẫn không thành công. Vẫn bị như lúc không sử dụng các hàm ARP. Các hàm ARP hầu như không gây ảnh hưởng gì? Có cách nào khác hay mình có làm sai chỗ nào không tanbka?
Code:

ARPResolve(&Server_info.IPAddr);
//DelayMs(1000);
if(ARPIsResolved(&Server_info.IPAddr,&Server_info.MACAddr))
{
MySocket = TCPOpen(Server_info.IPAddr.Val,TCP_OPEN_RAM_HOST,S erverPort,TCP_PURPOSE_GENERIC_TCP_CLIENT);
}

Mình có xem lại TCPIP Stack help thì hàm TCPOpen() đã làm luôn công việc hỏi địa chỉ MAC luôn, dùng hàm ARP là không cần thiết khi sử dụng các hàm TCPOpen() và UDPOpen().
Đuối quá, xin nói rõ hơn chút nữa là mình dùng cái App: GenericTCPClient.c;
+ Mình đã làm với cách là: mở Socket1=>truyền data=>đóng Socket1 =>mở Socket2=>truyền data=> đóng Socket2. Truyền nhận bình thường.
+ Nhưng mở Socket1=>mở Socket2 thì bị treo => tắt Server của Socket1 thì Socket2 truyền nhận bình thường =>mở lại Server Socket1 => Socket2 treo trở lại.
Có bạn nào hay anh chị nào đã làm với 2 Socket chạy song song như em xin chỉ bảo giúp với. Cảm ơn rất rất nhiều !!