socket程式設計(四)

2021-08-02 19:13:35 字數 2726 閱讀 5537

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 而不是 ...