Tôi đang lập trình ứng dụng ổ cắm máy khách/máy chủ C/C++. Tại thời điểm này, máy khách kết nối chính nó với máy chủ mỗi 50ms và gửi một thông báo.C ổ cắm máy khách/máy chủ lag
Tất cả mọi thứ dường như tác phẩm, nhưng dòng chảy dữ liệu không liên tục: Đột nhiên, máy chủ không nhận được bất cứ điều gì nhiều hơn, và sau đó 5 tin nhắn cùng một lúc ... Và đôi khi mọi thứ hoạt động ...
Có ai đó một ý tưởng về nguồn gốc của hành vi kỳ lạ này?
Một số phần của mã:
Chủ đầu tư:
while (true)
{
if (SDL_GetTicks()-time>=50)
{
socket = new socket();
socket->write("blah");
message.clear();
message = socket->read();
socket->close();
delete socket;
time=SDL_GetTicks();
}
}
Server:
while (true) {
fd_set readfs;
struct timeval timeout={0,0};
FD_ZERO(&readfs);
FD_SET(sock, &readfs);
select(sock + 1, &readfs, NULL, NULL, &timeout)
if(FD_ISSET(sock, &readfs))
{
SOCKADDR_IN csin;
socklen_t crecsize = sizeof csin;
SOCKET csock = accept(sock, (SOCKADDR *) &csin, &crecsize);
sock_err = send(csock, buffer, 32, 0);
closesocket(csock);
}
}
Chỉnh sửa: 1. Tôi đã cố gắng để làm
int flag = 1;
setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof flag);
Trong cả máy khách và máy chủ, nhưng vấn đề vẫn còn đó.
2.Yes những kết nối/deconnections rất inneficient, nhưng khi tôi cố gắng viết
socket = new socket();
while (true)
{
if (SDL_GetTicks()-time>=50)
{
socket->write("blah");
message.clear();
message = socket->read();
time=SDL_GetTicks();
}
}
Sau đó, thông điệp chỉ được gửi một lần (hoặc nhận) ...
Cuối cùng:
Tôi đã quên áp dụng TCP_NODELAY cho ổ cắm máy khách ở phía máy chủ. Bây giờ nó hoạt động hoàn hảo! Tôi đặt các quy trình trong các chủ đề sao cho các ổ cắm luôn mở. Cảm ơn tất cả các bạn :)
Tôi luôn bị cuốn hút bởi kiến thức của mọi người ở đây. Cảm ơn nhiều. Tôi sẽ cố gắng trong một thời gian :) – Klaus
+1 để chỉ đến khái niệm liên quan. –
Xem câu trả lời của tôi ở trên. – Klaus