關於socket編程的一點小思考

來源:互聯網
上載者:User

有幾個問題:

一、為什麼在bind的時候需要htons來轉換位元組序,而以後在send函數發送data的時候卻不需要轉換了呢?

我思考之後覺得:在開始bind的時候,連接埠號碼、IP參數都是以整數形式在進行bind操作,然而在發送資料時,發送、接受時的參數卻都是(const )char FAR *buf

這就意味著,發送、接受的不再是以整數形式存在的資料,而是以字串形式存在的資料;然而不管大端還是小端,在儲存字串時都是一樣的,這樣就不需要轉換,

不同的機器也都能正確識別了。          (在網路上的字串,字元數組的傳輸是沒有網路位元組順序的。他人的說法)

二、成功串連以後,使用recv/recvfrom函數接收資料,記憶體的情況是怎樣的呢?

一個已經取得串連的TCP socket sockConn 兩次接收資料的代碼如下:

char buf1[16];
recv(sockConn,buf1,16,0);
MessageBox(buf1);

char buf2[16];
recv(sockConn,buf2,16,0);
MessageBox(buf2);
與sockConn串連的另外一個TCP socketsockClient 兩次發送資料的代碼如下:
send(sockClient,"sendmessage1",strlen("sendmessage1")+1,0);   //包含字串結束符,共發送13位元組。
send(sockClient,"sendmessage2",strlen("sendmessage2"),0);       //不包含字串結束符,共發送12位元組。
sockConn的第一個messageBox(buf1);結果是sendmessage1,而第二個MessageBox(buf2);結果是sendmessage2燙燙sendmessage1。這時我就估計到記憶體的情況應該如所示:
也就是說buf2的記憶體空間剛好排在前一個接收資料容器buf1的前面,我估計這就是所謂的TCP資料流的意義吧,接收到的資料會連在一起,流式的。當使用MessageBox(buf2)輸出buf2的時候,就一直輸出,直到遇到後面buf1第13個位元組的結束符/0為止,所以就看到上面的輸出結果了。
看回sockConn第二次接收資料的語句,recv(sockConn,buf2,16,0);參數16是控制接收資料的位元組數,其實這個參數並不一定就要是buf的大小,它可以取任何大於0的整數值,如果我把sockClient第二次發送的語句改為:
send(sockClient,"sendmessage2ABCDEF",strlen("sendmessage2ABCDEF"),0);       //不包含字串結束符,共發送18位元組。
哪麼MessageBox(buf2);的結果就是sendmessage2ABCDsendmessage1,因為recv(sockConn,buf2,16,0);的參數16規定了最多隻接收16個位元組的資料,所以把資料“EF”丟棄掉。如果把recv(sockConn,buf2,16,0);改為recv(sockConn,buf2,18,0);哪麼MessageBox(buf2);的結果就是sendmessage2ABCDEFndmessage1,因為buf2隻有16個位元組的大小,接收到的第17、18個位元組“EF”就跟著buf2的末端繼續寫入記憶體,於是就把buf1的“se”改為“EF”了。如果改為recv(sockConn,buf2,20,0);哪麼MessageBox(buf2);的結果還是sendmessage2ABCDEFndmessage1,buf1的第三第四個位元組空間裡面的資料“nd”不會被改寫,因為接收到的資料還用不到這裡的空間。
簡單的說,recv函數的第三個參數就像是一個閘門,接收到的資料寫入記憶體時禁止越過這個閘門,如果閘門前的記憶體不夠寫入全部接收到的資料,那就把後面無法寫入的哪部分資料丟棄。如果閘門前的記憶體讓全部接收到的資料寫入後還有多餘的,那多餘的記憶體會保留原本的值,並不會被改寫。
甚至還可以改為recv(sockConn,buf2,40,0);buf1加上buf2總共才32個位元組,而我把recv的第三個參數改為40,如果sockClient發送了50個位元組,前40個位元組的內容能成功寫入記憶體。要注意的是,在buf1後面新開闢出來的8個位元組記憶體空間,是在buf2+buf1不夠記憶體寫入資料的時候才根據需要開闢的,例如如果sockClient只發送了30個位元組,那麼buf1後面是不會開闢任何記憶體空間的。而如果sockClient只發送了37個位元組,那麼buf1後面只開闢5個位元組的記憶體空間而不是開闢8個位元組的記憶體空間的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.