某公司的一道試題

2021-04-17 18:40:10 字數 1028 閱讀 5372

該**實現了乙個客戶端回射程式,即從使用者獲得輸入的一行文字,發給伺服器,當接到伺服器的應答資訊後,列印該資訊。請閱讀**回答問題。

#include    "unp.h"   // 可認為這行是正確的,包含了所有以下函式用到的標頭檔案。

int main(int argc, char **argv)

void str_cli(file *fp, int sockfd)

if (fd_isset(fileno(fp), &rset)) }}

1、請指出程式編碼不當的地方。

2、該**是否能完整實現功能,如果不能,什麼情況下會出現問題?

這題完全是《unix網路程式設計》中的例子,書上有詳解

1. 不當的地方可能是主函式中socket函式未作錯誤處理

2.  if (fgets(sendline, maxline, fp) == null)

return;  

這裡在批量輸入時有問題,fgets判斷返回stdio緩衝區的第一行,其餘留在緩衝區中,然後就writen(sockfd, sendline, strlen(sendline);然後繼續select,不管stdio緩衝區中還有待傳送的資料。

另外,如果讀到eof,就return到主函式,然後退出了,但是可能還有資料在網路上,造成資料沒有接收完全。

正確的方式,應該是:

void str_cli(file *fp, int sockfd)

fd_set(sockfd, &rset);

maxfdp1 = max(fileno(fp), sockfd);

select(maxfdp1, &rset, null, null, null);

if (fd_isset(sockfd, &rset))

if (fd_isset(fileno(fp), &rset))

writen(sockfd, buf, n);}}

}《unix網路程式設計》我是陸陸續續看的,始終沒看完,覺得在linux上開發網路程式終是麻煩,《windows網路程式設計技術》倒是本好書,還是微軟封裝的那些io模型好用些

一道oracle試題

做不出來時感覺好難啊,思路千千萬,就是沒想到用 order by 和 rownum 題目如下 有下面三個表 商品product 商品號productid,商品名productname,單價unitprice,商品類別category,商provider 顧客customer 顧客號customeri...

一道筆試題

看到一道筆試題,跟自己想的有點出入,就跑了下,看了看原因。我稍微改了下 include int main int argc,char argv 輸出結果 c 5 d 245 press any key to continue vc6.0 debug下的彙編 5 unsigned char a 0xa...

一道機試題

and return the new length.do not allocate extra space for another array,you must do this in place with constant memory.for example,given input array a...