Vấn đề về socket programming

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 ạ ? :blush:

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ả :joy:

#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.

2 Likes

Đọc bài của bác em cũng vỡ ra nhiều điều :kissing_heart:, 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 :blush:

1 Like

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.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?