酷!學園

技術討論區 => 程式討論版 => C/C++程式設計討論區 => 主題作者是: zelda 於 2012-12-07 02:09

主題: linux 用c寫socket
作者: zelda2012-12-07 02:09
我在centos 6.3下寫了一個測試socket程式
發現一個不解的事情,片段的程式如下:
char *buffer;
buffer = ( char* ) malloc( sizeof( char ) *200 ) ;
clientSock = accept( mysock, (struct sockaddr*)&client, &addrsize );
recv( clientSock, buffer, sizeof( buffer ), 0 );
char sendstring[] = "hello";
send(clientSock, sendstring, sizeof(sendstring), 0);
printf( "%s", buffer );

然後在windows下寫client,發送一個字元陣列
如果陣列有'\n'換行字元
server端才會顯示
否則沒有顯示
但client有收到server送出的字串而顯示出
所以看起來不像卡在接收
如果下一次有送出'\n'字元,則會連之前沒有顯示的一併出現
到底是為什麼會這樣?是linux的socket規定嗎?
要收到'\n',才會從buffer取出?
主題: Re: linux 用c寫socket
作者: twu22012-12-07 10:20
每個 function 都有回傳碼, 為什麼不去檢查結果而要用猜的?
如果是要印出收到什麼, 為什麼是放在送出之後才印?

如果要我猜你所說的情形的原因... 是因為你用 printf() 顯示, 而這函式, 除非去呼叫 fflush(), 否則本來就是要有換行才會處理.  自然會有你說的情形. 這與 socket 完全沒關係.
主題: Re: linux 用c寫socket
作者: zelda2012-12-28 01:09
每個 function 都有回傳碼, 為什麼不去檢查結果而要用猜的?
如果是要印出收到什麼, 為什麼是放在送出之後才印?

如果要我猜你所說的情形的原因... 是因為你用 printf() 顯示, 而這函式, 除非去呼叫 fflush(), 否則本來就是要有換行才會處理.  自然會有你說的情形. 這與 socket 完全沒關係.
以前都沒有注意到緩衝的問題,原來呼叫ffulsh()或者加換行符號就可以了
受教了