Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 21 kết quả

Đề tài: Sử dụng winsock để kiểm tra dịch vụ có online ko trong VC++ 2005?

  1. #1
    Ngày gia nhập
    05 2007
    Bài viết
    17

    Mặc định Sử dụng winsock để kiểm tra dịch vụ có online ko trong VC++ 2005?

    Trong vb6 để sử dụng winsock telnet tới 1 port ở 1 ip nào đó để kiểm tra dịch vụ đó có online không thì mình xài đoạn code như sau
    Code:
    telnet.RemoteHost = 1.2.3.4
    telnet.RemotePort = 10009
    telnet.Connect
    If telnet.State = sckConnected Then
        msgbox "service online"
    Else
        msgbox "service offline"
    End If
    Bro nào biết sử dụng winsock bên vc++ 2005 làm chức năng tương tự chỉ mình với. Cám ơn rất nhiều
    http://www.sonnb.com Offline Priston Tale Zone

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Em ko dùng VC2005 (ko có mà dùng) mà dùng VC6, nhưng chắc cũng tương tự thôi. Dùng từ telnet là ko đúng, đó là 1 dịch vụ, phải dùng từ "nối" mới đúng.

    Code:
    WSADATA wd;
    WSAStartup (MAKEWORD (2,2), &wd);            //Khởi tạo winsock
    
    SOCK sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);      //Khai báo và khởi tạo socket
    
    sockaddr_in name;                 //Cấu trúc chứa địa chỉ và port
    name.sin_addr.S_un.S_addr = inet_addr ("1.2.3.4");
    name.sin_family = AF_INET;
    name.sin_port = htons(10009);
    
    int ret = connect (sock, (sockaddr*) &name, sizeof (sockaddr));     //Kết nối
    if (ret)
    	MessageBox (NULL, "service offline", NULL, MB_OK);          //Trả về mã lỗi khác 0 nếu thất bại, dùng GetLastError () để lấy lỗi.
    else
    	MessageBox (NULL, "service online", NULL, MB_OK);         //Trả về 0 nếu thành công
    
    WSACleanup ();
    Bác cũng có thể tham khảo chương trình client này, cho phép kết nối, gửi nhận dữ liệu: http://files.myopera.com/hoanglinh94...oject/Send.rar
    Đã được chỉnh sửa lần cuối bởi hoanglinh9466 : 03-06-2007 lúc 11:16 AM.
    Life:\> dir

  3. #3
    Ngày gia nhập
    05 2007
    Bài viết
    17

    Cám ơn cậu để mình thử. Telnet đó chỉ là tên của winsock mình đặt cho nó dễ xài thôi. CÒn vc++ 2005 khác vc++6 lắm vì nó xài .NET
    http://www.sonnb.com Offline Priston Tale Zone

  4. #4
    Ngày gia nhập
    05 2007
    Bài viết
    17

    Code:
    WSADATA wd;
    WSAStartup (MAKEWORD (2,2), &wd);            //Khởi tạo winsock
    
    SOCKET sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);      //Khai báo và khởi tạo socket
    
    SOCKADDR_IN name;                 //Cấu trúc chứa địa chỉ và port
    name.sin_addr.S_un.S_addr = inet_addr ("58.186.154.144");
    name.sin_family = AF_INET;
    name.sin_port = htons(10009);
    
    int ret = connect (sock, (sockaddr*) &name, sizeof (sockaddr));     //Kết nối
    if (ret)
    	MessageBox::Show (L"Offline", L"Notice", MessageBoxButtons::OK, MessageBoxIcon::Information);          //Trả về mã lỗi khác 0 nếu thất bại, dùng GetLastError () để lấy lỗi.
    else
    	MessageBox::Show(L"Online", L"Notice", MessageBoxButtons::OK, MessageBoxIcon::Information);         //Trả về 0 nếu thành công
    
    WSACleanup ();
    Sửa lại như vậy là đúng nhưng sao nó báo lỗi này
    Code:
    1>winsock.obj : error LNK2001: unresolved external symbol "extern "C" int __stdcall WSAStartup(unsigned short,struct WSAData *)" (?WSAStartup@@$$J18YGHGPAUWSAData@@@Z)
    1>winsock.obj : error LNK2001: unresolved external symbol "extern "C" unsigned int __stdcall socket(int,int,int)" (?socket@@$$J212YGIHHH@Z)
    1>winsock.obj : error LNK2001: unresolved external symbol "extern "C" unsigned long __stdcall inet_addr(char const *)" (?inet_addr@@$$J14YGKPBD@Z)
    1>winsock.obj : error LNK2001: unresolved external symbol "extern "C" unsigned short __stdcall htons(unsigned short)" (?htons@@$$J14YGGG@Z)
    1>winsock.obj : error LNK2001: unresolved external symbol "extern "C" int __stdcall connect(unsigned int,struct sockaddr const *,int)" (?connect@@$$J212YGHIPBUsockaddr@@H@Z)
    1>winsock.obj : error LNK2001: unresolved external symbol "extern "C" int __stdcall WSACleanup(void)" (?WSACleanup@@$$J10YGHXZ)
    Giúp nốt nhé. Cám ơn nhiều
    [/code]
    http://www.sonnb.com Offline Priston Tale Zone

  5. #5
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Code này dùng hàm API trong file ws2_32.dll, nên anh phải #include <winsock2.h> và cho thêm ws2_32.lib vào danh sách các file để link.
    Life:\> dir

  6. #6
    Ngày gia nhập
    05 2007
    Bài viết
    17

    Mặc định Sử dụng winsock để kiểm tra dịch vụ có online ko trong VC++ 2005?

    Code:
    try {
    			IPAddress^ hostInfo ; 
    			hostInfo = System::Net::Dns::GetHostEntry(L"weasele.no-ip.info")->AddressList[0]; 
    
    				 Socket^ s = gcnew Socket(AddressFamily::InterNetwork,SocketType::Stream,ProtocolType::Tcp);
    					s->ReceiveTimeout	= 1000;
    				 s->Connect(hostInfo,10009);
    if (s->Connected){
    	MessageBox::Show("A","A",MessageBoxButtons::OK,MessageBoxIcon::Information);
    	}
    if (!s->Connected){
    	
    	}
    }
    catch (ArgumentOutOfRangeException^ e) {
    }
    catch ( SocketException^ f ) {
    	MessageBox::Show("B","B",MessageBoxButtons::OK,MessageBoxIcon::Information);
    }
    Sử dụng cái này là ok rồi. Đỡ lằng nhằng hơn cái kia . Nhưng mà có 1 vấn đề hơi nhỏ. ĐÓ là khi mà port đó ko mở ( hoặc máy đó tắt) thì sẽ phải chờ 1 lát nó mới hiện thông báo B( ko kết nối được ) ko biết làm sao chỉnh cái đó nữa
    http://www.sonnb.com Offline Priston Tale Zone

  7. #7
    Ngày gia nhập
    05 2007
    Bài viết
    17

    Cám ơn nhé. Cách trên cũng reply khá nhanh. Cám ơn nhiều. Cách trên thì sử dụng thư viện sẵn hệ thống còn cái này phải có .NET ><
    http://www.sonnb.com Offline Priston Tale Zone

  8. #8
    Ngày gia nhập
    05 2007
    Bài viết
    17

    À cho mình hỏi chút nữa là ko biết có dùng domain được ko? Ví dụ:

    name.sin_addr.S_un.S_addr = inet_addr ("weasel.no-ip.info")
    http://www.sonnb.com Offline Priston Tale Zone

  9. #9
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Hàm inet_addr chuyển 1 dãy số ip dạng string sang dạng số long nên ko làm vầy được. Anh phải lấy địa chỉ ip của host name đó bằng hàm gethostbyname

    hostent* host = gethostbyname ("weasel.no-ip.info");
    name.sin_addr.S_un.S_addr = *(long*) host->h_addr_list[0];

    Sau đó mới connect với cấu trúc name được
    Life:\> dir

  10. #10
    Ngày gia nhập
    05 2007
    Bài viết
    17

    Cám ơn nhé. Chạy rất tốt. Tại mình làm quen sơ qua ebook + search google nên ko biết nhiều về c++ cám ơn nhiều
    Đã được chỉnh sửa lần cuối bởi sonnb : 03-06-2007 lúc 10:38 PM.
    http://www.sonnb.com Offline Priston Tale Zone

Các đề tài tương tự

  1. Lập trình Winsock trong C# | Winsock programing with C#
    Gửi bởi ZCoder87 trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 27
    Bài viết cuối: 07-04-2013, 11:55 AM
  2. Hoạt động của hàm accept connection trong Winsock(Lap trinh mạng)?
    Gửi bởi sasadudu trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 1
    Bài viết cuối: 23-03-2011, 11:11 AM
  3. Phân biệt dữ liệu nhận được trong lập trình winsock.
    Gửi bởi Joker trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 3
    Bài viết cuối: 21-01-2011, 10:30 AM
  4. Cách tạo Thread trong lập trình WinSock.
    Gửi bởi snake_programmer trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 09-01-2011, 01:54 PM
  5. Đa luồng trong lập trình WinSock xử lý như thế nào?
    Gửi bởi Socket trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 4
    Bài viết cuối: 30-12-2010, 11:55 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn