處理tcp粘包問題

2021-07-23 20:21:29 字數 2201 閱讀 8002

tcp是位元組流,無邊界,udp是訊息,是有邊界的。。就是udp返回的就是乙個訊息。。所以tcp會產生粘包問題。。

如何解決粘包問題,。。所以我們要在應用層維護訊息與訊息的邊界。。比如說定長包,包尾加\r\n(ftp),包頭加包體長度,更複雜的應用層協議。。

readn接受確切資料的讀操作

cli:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define err_exit(m) printf("error")

struct packet

;ssize_t readn(int fd, void *buf, size_t count)else if(nread == 0)

bufp += nread;

nleft -= nread;

}return count;

}ssize_t writen(int fd, const void *buf, size_t count)else if(nwrittern == 0)

bufp += nwrittern;

nleft -= nwrittern;

}return count;

}int main();

char recvbuf[1024] = ;

int n;

while(fgets(sendbuf.buf, sizeof(sendbuf.buf), stdin) != null)

n = ntohl(recvbuf.len);

ret = readn(sock, recvbuf.buf, n);

if(ret == -1) err_exit("read");

else if(ret < n)

fputs(recvbuf.buf, stdout);//huishe

memset(sendbuf, 0, sizeof(sendbuf));

memset(recvbuf, 0, sizeof(recvbuf));

}close(sock);

return 0;

}sev:

/** socket03_echocli.cpp

**  created on: oct 15, 2016

*      author: root

*/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define err_exit(m) printf("error")

struct packet;

ssize_t readn(int fd, void *buf, size_t count)else if(nread == 0)

bufp += nread;

nleft -= nread;

}return count;

}ssize_t writen(int fd, const void *buf, size_t count)else if(nwrittern == 0)

bufp += nwrittern;

nleft -= nwrittern;

}return count;

}void do_service(int conn)else if(ret == -1)

n = ntohl(recvbuf.len);

ret = readn(conn, recvbuf.buf, n);

if(ret == -1) err_exit("read");

else if(ret < n)

fputs(recvbuf.buf, stdout);

write(conn, &recvbuf, 4+n);}}

int main()

if (pid == 0)else

close(conn);

}return 0;

}

tcp粘包,斷包問題及處理

做過乙個五子棋大作戰遊戲,當時用socket長連線在人人聯網對戰時進行處理,但在遊戲過程中總會出現兩個下棋的人接收不到對方棋子的落點的資訊,這就是典型的出現了tcp粘包問題。下來進行具體說明。1.理解nagle演算法 當傳送方每次傳送的資料報都比較小時,而這種小的資料報又比較多時,就會導致網路擁塞,...

tcp粘包問題

什麼是粘包問題 粘包問題的起因是socket的快取機制。簡而言之 粘包問題就是如何將連續的資料按照不同的資料幀截斷,以及如何處理殘包情況。分割資料需要按需分配。處理殘包也很簡單 等 等它發來下一包資料,不管他發來多少資料,先拿來512,接到上次那512後面。湊成完整的資料幀。當然也有可能你發現這次來...

TCP粘包問題

原因 tcp提供的是一種位元組流服務,沒有訊息保護邊界。傳送端需要等緩衝區滿才傳送出去,造成粘包 接收方不及時接收緩衝區的包,造成多個包接收 解決方法 一是對於傳送方引起的粘包現象,使用者可通過程式設計設定來避免,tcp提供了強制資料立即傳送的操作指令push,tcp軟體收到該操作指令後,就立即將本...