Em vừa học sơ qua về lập trình socket trong c++, cụ thể là lập trình socket bằng MFC của VS
Khi muốn kết nối với server và địa chỉ là localhost thì code có dạng :
Client.Connect(_T(“127.0.0.1”),port tu chon);
Vấn đề của em là khi thay “127.0.0.1” bằng một chuỗi, ví dụ _T(ipnhapvao) (ipnhapvao là ip mình yêu cầu nhập vào khi khởi động client ) thì lại báo lỗi.
Theo em tổng hợp từ google thì macro _T() không thể nhận một biến, có cao nhân nào chỉ em cách khắc phục được không ạ ?
Vấn đề về socket programming
TL;DR: bỏ macro _T
đi là xong, _T
chỉ đi chung với chuỗi thô (ý mình là chuỗi trong ngoặc kép, không phải biến). Lưu ý, biến chuỗi phải có dạng LPCTSTR/LPTSTR (nếu không xài UNICODE thì dùng char* cũng đủ rồi).
Đúng rồi, method Connect
có prototype như sau: BOOL Connect(LPCTSTR lpszHostAddress, UINT nHostPort);
với LPCTSTR
là __L__ong __P__ointer __C__onst __T__char __STR__ing. Trong đó, TCHAR nó phụ thuộc vào project bạn có sử dụng UNICODE hay không thôi và macro _T
để tương thích chuỗi theo ANSII hay UNICODE.
Macro _T
đơn giản là thêm tiền tố L
trước chuỗi nếu đã định nghĩa UNICODE, còn không thì không làm gì cả
#ifdef _UNICODE
# define _T(raw_string) L##raw_string
#else
# define _T(raw_string) raw_string
#endif
Nếu bạn không làm việc với UNICODE thì không cần phải phức tạp, bỏ _T
đi, thay vào đó là biến.
Đọc bài của bác em cũng vỡ ra nhiều điều , em đã thử tạo một biến chuỗi char và khi truyền đối số cho hàm connect thì ép thêm kiểu (LPCTSTR) và đã thành công.
Cảm ơn sự nhiệt tình của bác
Nếu bạn nào có vấn đề tương tự thì có thể bấm Alt + F7 để mở properties , Configuration Properties > General. Switch Character Set to “Use Multi-Byte Character Set”. Sau đó sẽ sử dụng biến chuỗi bình thường, không cần ép kiểu hay sử dụng macro _T.