01/10/2018, 11:25

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

Khoa NTA viết 13:32 ngày 01/10/2018

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.

Khang Nguyễn viết 13:29 ngày 01/10/2018

Đọ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

Khang Nguyễn viết 13:31 ngày 01/10/2018

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.

Bài liên quan
0