Gửi dữ liệu qua TCP/IP Winsock

Chào các bạn, mình hiện đang gặp trục trặc trong quá trình truyền dữ liệu dạng double từ client tới server qua TCP/IP. Về nguyên lí, sau khi connect thành công, sẽ thực hiện lệnh send(socketClient, (char*)&Data_Send, sizeof(Data_Send), 0).

Mình đã tạo biến stringstream ss và string res để chuyển dữ liệu userDataBuffer từ dạng double sang char rồi lưu vào biến Data_Send. Nhưng khi mình gửi dữ liệu thì phía server hiển thị: Date Time Current Voltage Air-Pressure 000000000000000000000000000000000000000…

Mình có thử vài phương pháp khác nhưng cũng chỉ ra dữ liệu trống. Mong các bạn gợi ý cách xử lí vấn đề này. Dưới đây là code của mình

char Data_Send[10000];
char item[] = " Date\t" "Time\t" "Current\t" "Voltage\t" "Air-Pressure\t";
string res;
stringstream ss;

strcpy(Data_Send, item);	
for (int32 i = 0; i < returnedCount; i = i + channelCount)
{
	ss << userDataBuffer[i];  // Sensor data
	ss >> res;
	strcat(Data_Send, (char*)&res);
}

if (connect(socketClient, (sockaddr*)&clientAddr, sizeof(clientAddr)) == 0)
					{
						cout << "\nConnection success..!";
						cout << "\nConnect with Server's IP: " << inet_ntoa(clientAddr.sin_addr);
						cout << "\nStart communicating";
						
						cin.getline(Data_Send, 5120);
						send(socketClient, (char*)&Data_Send, sizeof(Data_Send), 0);				
					}

Có vẻ sai ở câu lệnh này.
Nếu muốn convert string của C++ sang char* của C thì chỉ cần đơn giản như này thôi :
strcat(Data_Send, res.c_str())

2 Likes

Mình đã thử cách đó trước rồi. Nhưng vẫn chỉ ra chuỗi 00000000000

for (int32 i = 0; i < returnedCount; i = i + channelCount)
					{
						ss << userDataBuffer[i];
						ss >> res;
						strcat(Data_Send, res.c_str());
						//strcat(Data_Send, (char*)&res);
					}
if (connect(socketClient, (sockaddr*)&clientAddr, sizeof(clientAddr)) == 0)
					{
						cout << "\nConnection success..!";
						cout << "\nConnect with Server's IP: " << inet_ntoa(clientAddr.sin_addr);
						cout << "\nStart communicating";
	
						send(socketClient, (char*)Data_Send, strlen(Data_Send), 0);
					}

code này viết C & C++ lẫn lộn quá, thử không dùng sstream nữa mà chơi thuần array của C xem

userDataBuffer[i] là số nguyên à? Nếu xài C++11 thì xài to_string(userDataBuffer[i]) luôn cho lành dẹp stringstream đi :V

for (int32 i = 0; i < returnedCount; i = i + channelCount)
    strcat(Data_Send, to_string(userDataBuffer[i]).c_str());

mà chỗ thì xài C++ string chỗ thì xài C string là sao vậy :V Có thể viết lại xài C++ string thế này được ko:

string dataSend = " Date\t" "Time\t" "Current\t" "Voltage\t" "Air-Pressure\t";
for (int i = 0; i < returnedCount; i += channelCount)
    dataSend += to_string(userDataBuffer[i]);

if (connect(socketClient, (sockaddr*)&clientAddr, sizeof(clientAddr)) == 0)
{
    cout << "\nConnection success..!";
    cout << "\nConnect with Server's IP: " << inet_ntoa(clientAddr.sin_addr);
    cout << "\nStart communicating";
    send(socketClient, dataSend.data(), dataSend.size(), 0);
}

nếu string += chậm thì xài thử ostringstream

ostringstream oss;
oss << " Date\t" "Time\t" "Current\t" "Voltage\t" "Air-Pressure\t";
for (int i = 0; i < returnedCount; i += channelCount)
    oss << userDataBuffer[i];
string dataSend = oss.str();
// gửi dataSend đi như bên trên
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?