Trang 3 trên tổng số 6 Đầu tiênĐầu tiên 12345... Cuối cùngCuối cùng
Từ 21 tới 30 trên tổng số 60 kết quả

Đề tài: Lập Trình Mạng Với Thư Viện Winsock trên VC++

  1. #21
    Ngày gia nhập
    02 2009
    Bài viết
    75

    Mặc định Lập Trình Mạng Với Thư Viện Winsock trên VC++

    Trích dẫn Nguyên bản được gửi bởi ashark Xem bài viết
    Đúng rồi cách viết thì giông mạng LAN thôi, nhưng tao socket lắng nghe với IP là IP nào có phải IP trên trang www.ip-adress.com hok ?? em làm thử với cái IP public này rồi nhưng không được
    Server ở đây là bạn cần có 1 máy chủ với IP public giống như cái trang kia bạn
    lấy được ấy chứ không phải là ma'y bạn với 1 con server chạy đâu

    chán code, ghét máy tính rồi

  2. #22
    Ngày gia nhập
    11 2008
    Bài viết
    12

    Trích dẫn Nguyên bản được gửi bởi ngavnt4 Xem bài viết
    cho em hỏi lập trình lấy dữ liệu từ trang web về thì có liên quan tới IP không nhỉ
    Đã liên quan đến NET là liên quan tới IP rồi, WEB cũng là NET thì không thể loại bỏ IP ra được.

    Trích dẫn Nguyên bản được gửi bởi ngavnt4 Xem bài viết
    Có cách nào để lấy dữ liệu trong một trang web chẳng hạn như văn bản dịch từ google.translate về không?
    Hoàn toàn có thể lấy được dữ liệu từ WEB về, chẳng hạn như văn bản dịch từ Google.

    Bạn đễ ý một chút sẽ thấy: ví dụ muốn tra nghĩa từ Hello chẳng hạn thì cái url của translate.google.com.vn sẽ là:

    Code:
    http://translate.google.com.vn/translate_t?prev=hp&hl=vi&js=y&text=Hello&file=&sl=en&tl=vi&history_state0=#
    Cho nên mình hoàn toàn có thể yêu cầu máy chủ Google gửi về nội dung dịch của một từ nào đó bằng cách tạo một link như trên và gửi về máy chủ của Google.

    Sau khi nhận được nội dung dịch của Google bạn phải bóc tách các phần ra thì mới có được dữ liệu dịch.

    Trình duyệt với server WEB cũng chỉ là một dạng mô hình Server - Client nên mình hoàn toàn có thể làm được.

    Trích dẫn Nguyên bản được gửi bởi ashark Xem bài viết
    Đúng rồi cách viết thì giông mạng LAN thôi, nhưng tao socket lắng nghe với IP là IP nào có phải IP trên trang www.ip-adress.com hok ?? em làm thử với cái IP public này rồi nhưng không được
    Như thế này bạn à ! khi lập trình ứng dụng Server - Client địa chỉ IP bạn lấy thế nào còn tùy vào bạn chạy Server và Client như thế nào nữa.

    Nếu bạn chạy Server và Client cùng một mạng LAN thì Client phải lấy địa chỉ IP của Server trên mạng LAN ví dụ : 192.168.1.2

    Nếu bạn chạy Server và Client không phải cùng mạng LAN thì Client bạn phải lấy địa chỉ IP của Server trên WAN ví dụ : 123.18.187.98, hay nói cách khác lúc đó Client muốn connect được tới Server thì phải lấy địa chỉ của Server giống trên trang www.ip-adress.com

    Còn khi Server Listen hoặc Bind thì lấy địa chỉ IP ở trên mạng LAN ví dụ : 192.168.1.2

    Cái IP của bạn trên www.ip-adress.com là địa chỉ IP modem của bạn trên WAN.
    Đã được chỉnh sửa lần cuối bởi RocK : 07-10-2009 lúc 08:15 PM.

  3. #23
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Bản thân server muốn listen trên mạng internet cũng làm y chang mạng LAN.

    Có nghĩa là nó vẫn chỉ được bind địa chỉ IP của chính nó ví dụ: 192.168.1.2

    Còn việc client nối được tới server là 1 chuyện khác, bởi vì quy trình này đòi hỏi bạn phải thiết lập hệ thống mạng sao cho client có thể connect tới máy chủ ở internet thông qua 1 địa chỉ IP WAN tĩnh hoặc 1 domain (cái này nó về phần networks, tức là do networks administrator cấu hình chứ ko phải là do programer viết chtr lên).

    Thực ra thì quy trình cấu hình này nó không phức tạp mà bản chất chỉ là quá trình NAT (hiểu nôn na là bạn đang chuyển địa chỉ IP WAN sang địa chỉ IP LAN)

    Cái này thì bạn có thể nghiên cứu trên google rất nhiều cách cấu hình NAT trên ADSL Modem để bạn có thể connect vào hệ thống nhà bạn bấ cứ ở nơi đâu.

    Mình ví dụ nhé:
    - Nếu bạn connect vào google.com

    1. Thì đầu tiên DNS sẽ chuyển thành IP WAN: 74.125.67.100

    2. Như vậy client nó sẽ connect vào IP 74.125.67.100
    - IP này thực sự ko phải là server đang lắng nghe kết nối. Thông thường nó là 1 Firewall hoặc là 1 Router, cũng có thể là ADSL router (nếu mạng gia đình) tuỳ thuộc vào hệ thống mạng được thiết lập trước đó.

    3. Sau đó là đến quy trình NAT. Firewall nó sẽ nat theo Port mà client muốn kết nối và chuyển gói tin đến đúng server xử lý đặt trong mạng LAN (dĩ nhiên server này chỉ càn lắng nghe trên IP của nó ).

    Ví dụ:
    - Port 80 thì nó sẽ chuyển cho web server. Server này đặt trong hệ thống LAN của riêng google (và có thể có rất nhiều server ở đây, phục vụ cho quá trình cân bằng tải)
    - Nếu port 25 thì nó sẽ chuyển qua cho mail server.
    - Và các port khác nữa...

    4. Server sau khi nhận được request nó sẽ phải response lại cho firewall ở địa chỉ 74.125.67.100 và từ firewall này nó mới chuyển lại cho client của bạn.
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 08-10-2009 lúc 12:38 PM.

  4. #24
    Ngày gia nhập
    06 2009
    Bài viết
    11

    Trích dẫn Nguyên bản được gửi bởi RocK Xem bài viết
    Cho nên mình hoàn toàn có thể yêu cầu máy chủ Google gửi về nội dung dịch của một từ nào đó bằng cách tạo một link như trên và gửi về máy chủ của Google.

    Sau khi nhận được nội dung dịch của Google bạn phải bóc tách các phần ra thì mới có được dữ liệu dịch.
    hì điều mình muốn hỏi là làm sao thực hiện được cái này, gửi link đó tới máy chủ và lấy dự liệu về như thế nào mới khó. Cần được giúp đở, thank

  5. #25
    Ngày gia nhập
    11 2008
    Bài viết
    12

    Bạn đọc lại bài DEMO MINI WEB BROWSER của bạn Dreaminess bài Post thứ 5 ở trang 1 nhé:

    Link : http://forums.congdongcviet.com/show...89&postcount=5

    Ở cái ví dụ đó có cách gửi link tới máy chủ và nhận dữ liệu trả về, sau đó phân tích và hiển thị.

    Bạn có thể đọc tham khảo và chỉnh sửa để có thể sử dụng được với translate.google.com.vn

    Để làm tốt bạn cần biết được cấu trúc dữ liệu gửi và nhận giữ Brower và Web server, bạn có thể cài Wireshark để tìm hiểu kỹ hơn.

    Good luck.

  6. #26
    Ngày gia nhập
    11 2008
    Bài viết
    12

    Mặc định Lập Trình Mạng Với Thư Viện Winsock trên VC++

    Google Translate

    Demo:

    Code:
    #include <stdio.h>
    #include <tchar.h>
    #include <iostream>
    #include <vector>
    #include <winsock2.h>
    
    #pragma comment (lib,"ws2_32.lib")
    
    using namespace std;
    
    #define WPORT 80
    #define WHOST "translate.google.com.vn"
    
    bool Startup  (SOCKET& sock);
    bool Connect  (SOCKET& sock);
    void Shutdown (SOCKET& sock);
    
    std::vector<std::string> Tokenize(const std::string & str, const std::string & delim);
    
    bool Startup(SOCKET& sock)
    {
    	DWORD dwError = 0;
    
    	WSADATA wsaData = {0};
    
    	dwError = WSAStartup(MAKEWORD(2,2), &wsaData);
    
    	if(dwError != ERROR_SUCCESS)	
    	{
    		printf("Startup winsock fail !...\n");
    		return 0;
    	}
    
    	printf("Startup winsock successful !...\n");
    	sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    
    	if (sock == INVALID_SOCKET)
    	{
    		printf("Start socket fail !...\n");
    		WSAGetLastError();
    		WSACleanup();
    		return 0;
    	}
    	printf("Start socket successful\n");
    	return 0;
    }
    
    bool Connect (SOCKET& sock)
    {
    	DWORD		dwError		= 0;
    	hostent		*host		= 0;
    	sockaddr_in srvHost		= {0};
    
    	host = gethostbyname(WHOST);
    	srvHost.sin_family		= AF_INET;
    	srvHost.sin_port		= htons(WPORT);
    	srvHost.sin_addr.s_addr = *((unsigned long*)host->h_addr);
    
    	dwError = connect(sock, (struct sockaddr*)&srvHost, sizeof(srvHost));
    
    	if(dwError)	
    	{
    		dwError = WSAGetLastError();
    		printf("Connect to [%s:%d] fail !...\n",WHOST,WPORT);
    		return 0;
    	}
    	printf("Connect to [%s:%d] successful !...\n",WHOST,WPORT);
    	return 1;
    }
    
    void Shutdown(SOCKET& sock)
    {
    	if(sock)
    	{
    		closesocket(sock);
    		printf("Close socket done !...\n");
    	}
    	WSACleanup();
    	printf("Clear winsock done !...\n");
    }
    
    void main()
    {
    	SOCKET sock;
    	Startup(sock);
    	Connect(sock);
    
    	string Line		= "";
    	string Link		= "GET /translate_a/t?client=t&text=Hello&sl=en&tl=vi&pc=0&oc=1 HTTP/1.1\r\n";
    	string Request	= "Host: translate.google.com.vn\r\n";
    	string UserAgent= "User-Agent: Translate Client\r\n\n";
    
    	char szLine[200] = {0};
    
    	do
    	{
    		printf("Translate: ");
    		scanf("%s",szLine);
    		Link  = "GET /translate_a/t?client=t&text=";
    		Link += szLine;
    		Link += "&sl=en&tl=vi&pc=0&oc=1 HTTP/1.1\r\n";
    
    		send(sock,Link.data()		,Link.length()		,0);
    		send(sock,Request.data()	,Request.length()	,0);
    		send(sock,UserAgent.data()	,UserAgent.length()	,0);
    
    		bool done				= false;
    		int	 EndHeader			= false;
    		int  iByteRevc			= 0;
    		char HTMLHeader			= 0;
    		char HTMLResponse[5120] = {0};
    
    		while(!done)
    		{
    			iByteRevc = recv(sock,&HTMLHeader,1,0);
    
    			if(iByteRevc < 0) done = true;
    
    			switch(HTMLHeader)
    			{			
    				case '\r':
    					break;
    				case '\n':
    					if (EndHeader == true)
    					{						
    						done = TRUE;
    					}
    					EndHeader=true;
    					break;
    				default:
    					EndHeader=false;
    					break;
    			} 
    		}
    
    		do
    		{
    			iByteRevc = recv(sock,HTMLResponse,sizeof(HTMLResponse)-1,0);
    			if (HTMLResponse[0] == 0)
    				HTMLResponse[0] = ' ';
    			if(iByteRevc < 0)	break;
    			HTMLResponse[iByteRevc] = 0;
    		}
    		while(0);
    
    		std::vector<std::string> Token;
    		Token = Tokenize(HTMLResponse,"[],\"");
    
    		printf("--------------------------------------\n");
    		for(int i=1;i<Token.size()-1;i++)
    		{
    			printf("%s\n",Token[i].data());
    		}
    		printf("--------------------------------------\n");
    	}
    	while(strcmp(szLine,"exit") != 0);
    
    	Shutdown(sock);
    }
    
    std::vector<std::string> Tokenize(const std::string & str, const std::string & delim)
    {
    	using namespace std;
    	vector<string> tokens;
    	size_t p0 = 0, p1 = string::npos;
    	while(p0 != string::npos)
    	{
    		p1 = str.find_first_of(delim, p0);
    		if(p1 != p0)
    		{
    			string token = str.substr(p0, p1 - p0);
    			tokens.push_back(token);
    		}
    		p0 = str.find_first_not_of(delim, p1);
    	}
    	return tokens;
    }
    Attached Files Attached Files

  7. #27
    Ngày gia nhập
    06 2009
    Bài viết
    11

    rất rất cảm ơn bạn RocK, mình sẽ cố gắng làm
    Đã được chỉnh sửa lần cuối bởi ngavnt4 : 10-10-2009 lúc 07:16 AM.

  8. #28
    Ngày gia nhập
    02 2008
    Nơi ở
    Đà Nẵng
    Bài viết
    2

    Mặc định Làm sao vậy mình cũng gặp vấn đề giống bạn đó

    Trích dẫn Nguyên bản được gửi bởi quangnh89 Xem bài viết
    Vấn đề mình đang vướng là khi debug thì chạy bình thường (tức là client đăng nhập và nhận được danh sách Buddy List trả về, hiển thì được trong ListView ), nhưng khi chạy trực tiếp(tức là ko debug ) thì chảng nhận được gì . Bạn nào biết giúp mình với.

    Mod xóa hộ mình bài này nhé, mình tự làm được rồi
    Mình cũng bị cái lỗi giống như bạn vậy,híc. Hên gê search dc bài này, gửi tin nhắn cho mình với

  9. #29
    Ngày gia nhập
    02 2010
    Bài viết
    1

    Bài viết của bạn thật hay.Mình cũng đang học liên quan đến lập trình về Winsock,thầy mỉnh bắt viết một chương trình để phát hiện địa chỉ IP nào đang chạy,port nào đang sử dụng,và hệ điều hành nào đang chạy ở máy đầu xa.Mong bạn chia sẻ cho minh cách làm với

  10. #30
    Ngày gia nhập
    12 2008
    Bài viết
    25

    Chào mọi người, cho em hỏi vấn đề này, em đang viết ứng dụng chat 1 sever - n Client bằng MFC sử dụng CAsyncsocket. Tình hình là em viết 1 server 1 client chạy rất tốt nhưng khi phát triển lên nhiều client thì không được. Em tạo 1 mảng CArray <CChatSocket*,CChatSocket*> m_mang;(CChatSocket là 1 class CAsynSocket). sau đó gán cho nó 15 phần tử m_mang.SetSize(15);
    Hàm OnAccept em vik như sau:
    Visual C++ Code:
    1. for (int i = 0;m_mang.GetSize();i++)
    2.     {
    3.         m_mang[i] = new CChatSocket;
    4.             if (m_sListener.Accept(*m_mang[i]))
    5.             {  
    6.                 m_mang[i]->AsyncSelect(FD_READ|FD_CLOSE);
    7.                 GetDlgItem(IDC_SEND)->EnableWindow(TRUE);
    8.                 GetDlgItem(IDC_EDITCHAT)->EnableWindow(TRUE);
    9.                 GetDlgItem(IDC_LISTEN)->EnableWindow(FALSE);
    10.                 AfxMessageBox("Chap nhan ket noi");
    11.                     return;
    12.             }
    13.             else
    14.             {
    15.                 AfxMessageBox("Khong chap nhan ket noi");
    16.             }
    17.     }
    Bây giờ em viết hàm OnReceive() như thế nào để khi 1 client gửi 1 thông điệp lên thì sever sẽ nhận được và gửi lại cho tất cả các client đã kết nối tới sever vậy các pác.

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. Cách tạo voice chat bằng winsock viết trên MFC Dialog?
    Gửi bởi phamduyhung trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 26-06-2012, 04:39 PM
  3. Sách MFC Winsock tiếng việt tìm ở đâu?
    Gửi bởi aptx1987 trong diễn đàn Công cụ, ebooks VC++
    Trả lời: 1
    Bài viết cuối: 23-08-2011, 06:39 PM
  4. Borland C++ Lỗi Thư viện winsock,winsock2
    Gửi bởi tauit_dnmd trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 05-04-2010, 08:49 PM
  5. Lập trình winsock trên VC++. Lỗi do đâu?
    Gửi bởi vietwow trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 02-06-2009, 04:26 PM

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