tcp是乙個基於位元組流的傳輸服務,"流"意味著tcp所傳輸的資料是沒有邊界的。這不同於udp提供基於訊息的傳輸服務,其傳輸的資料是有邊界的。tcp的傳送方無法保證對等方每次接收到的是乙個完整的資料報。主機a向主機b傳送兩個資料報,主機b的接收情況可能是
(1)應用層呼叫write方法,將應用層的緩衝區中的資料拷貝到套接字的傳送緩衝區。而傳送緩衝區有乙個so_sndbuf的限制,如果應用層的緩衝區資料大小大於套接字傳送緩衝區的大小,則資料需要進行多次的傳送。
(2)tcp所傳輸的報文段有mss的限制,如果套接字緩衝區的大小大於mss,也會導致訊息的分割傳送。
(3)由於鏈路層最大傳送單元mtu,在ip層會進行資料的分片。
(1)傳送定長包。如果每個訊息的大小都是一樣的,那麼在接收對等方只要累計接收資料,直到資料等於乙個定長的數值就將它作為乙個訊息。
(2)包尾加上\r\n標記。ftp協議正是這麼做的。但問題在於如果資料正文中也含有\r\n,則會誤判為訊息的邊界。
(3)包頭加上包體長度。包頭是定長的4個位元組,說明了包體的長度。接收對等方先接收包體長度,依據包體長度來接收包體。
(4)使用更加複雜的應用層協議。
echoserver.cpp
#include #include #include #include #include #include #include #include #include #define err_exit(m) \
do \
while(0)
/* param1:fd, param2:buf, param3:count
return:讀取成功位元組數
ssize_t:有符號
size_t:無符號
*/struct packet ;
ssize_t readn(int fd, void* buf, size_t count) else if (0 == nread)
bufp += nread;
nleft -= nread;
}return count;}/*
param1:fd, param2:buf, param3:count
return:已經傳送了多少
*/ssize_t writen(int fd, void* buf, size_t count) else if(0 == nwrite)
bufp += nwrite;
nleft -= nwrite;
} return count;
}void do_service(int conn) else if(4 > ret)
n = ntohl(recvbuf.len);
ret = readn(conn, recvbuf.buf, n);
if(ret < n) else if(-1 == ret)
fputs(recvbuf.buf, stdout);
writen(conn, &recvbuf, 4+n);
}}int main ()
if(pid == 0) else
}close(listenfd);
close(conn);
return 0;
}
echoclient.cpp
#include #include #include #include #include #include #include #include #include #define err_exit(m) \
do \
while(0)
struct packet ;
ssize_t readn(int fd, void* buf, size_t count) else if (0 == nread)
bufp += nread;
nleft -= nread;
}return count;
}ssize_t writen(int fd, void* buf, size_t count) else if(0 == nwrite)
bufp += nwrite;
nleft -= nwrite;
} return count;
}int main () ;
//char recvbuf[1024] = ;
int n;
while(fgets(sendbuf.buf, sizeof(sendbuf.buf), stdin) != null) else if(4 > ret)
n = ntohl(recvbuf.len);
ret = readn(sock, recvbuf.buf, n);
if(ret < n) else if(-1 == ret)
//readn(sock, recvbuf, sizeof(recvbuf));
fputs(recvbuf.buf, stdout);
memset(&sendbuf, 0, sizeof(sendbuf));
memset(&recvbuf, 0, sizeof(recvbuf));
}close(sock);
return 0;
}
socket程式設計
一直以為serversocket accept之後客戶端才能發資訊,實驗後得出如下結論 1 serversocket沒有accept時,client是可以傳送資訊到server端的。2 serversocket accept之後,正在處理訊息時,client也是可以傳送資訊到server端。如果se...
Socket程式設計
對tcp ip udp socket程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問 1.什麼是tcp ip udp?2.socket在 呢?3.socket是什麼呢?4.你會使用它們嗎?什麼是tcp ip udp?tcp ip transmission cont...
socket程式設計
建立socket 建立乙個 socket,它可用於在基於 tcp ip 的網路 如 internet 上通訊。socket s new socket addressfamily.internetwork,sockettype.stream,protocoltype.tcp 若要使用 udp 而不是 ...