服務端是用多執行緒寫的併發伺服器,比較簡單。
功能:1. 服務端執行後,即監聽指定的埠。允許多個連線併發執行
2. 服務端接收到客戶端請求後,根據客戶端傳過來的指令完成特定任務:
a) 向客戶端傳送服務端所在機器的當前時間
b) 向客戶端傳送服務端所在機器的名稱
c) 向客戶端傳送當前連線的所有客戶端資訊
d) 其它(向客戶端傳送鍵盤輸入的內容)
3. 客戶端執行後,可以執行以下任務:
a) 連線到指定位址和埠的服務端
b) 斷開與服務端的連線
c) 請求服務端給出當前時間
d) 請求服務端給出其機器的名稱
e) 請求服務端給出當前連線的所有客戶端資訊(編號、ip位址、埠等)
f) 給其他客戶端傳送鍵盤輸入的內容
g) 退出客戶端程式
h) 其它(向伺服器端傳送鍵盤輸入的內容)
客戶端:
#include #include #include #include #include #include #include int main(int argc,char *argv)
//獲得輸入的埠
port=atoi(argv[2]);
//建立套節字用於客戶端的連線
connect_fd=socket(pf_inet,sock_stream,0);
if(connect_fd<0)
//填充關於伺服器的套節字資訊
memset(&srv_addr,0,sizeof(srv_addr));
srv_addr.sin_family=af_inet;
srv_addr.sin_addr.s_addr=inet_addr(argv[1]);
srv_addr.sin_port=htons(port);
//連線伺服器,如果連線失敗 ret==-1,結束程式
ret=connect(connect_fd,(struct sockaddr *)&srv_addr,sizeof(srv_addr));
if(ret==-1)
memset(snd_buf,0,1024);
//成功連線伺服器
while(1)
len=read(connect_fd,snd_buf,1024);//如果伺服器發來資訊,則讀取,否則等待。。
if(len>0)
printf("message form server(%d): %s\n",len,snd_buf);//列印從伺服器收到的資訊
if(snd_buf[0]=='@')//@為退出字元。 跳出迴圈
break;
} close(connect_fd);//斷開與伺服器的連線。
return 0;
}
服務端:
#include #include #include #include #include #include #include #include #include #include #include #include #include struct sockaddr_in clt_addr;
struct sockaddr_in srv_addr;
//執行緒執行函式負責讀寫
void *thr_fn(void *arg)
else if(recv_buf[0]== '#')//host message
lens=strlen(uts.nodename);
char* hostdate=uts.nodename;
printf("message from client(%d): %s\n",new_fd,recv_buf);
write(new_fd,hostdate,lens);
}else if(recv_buf[0]== '$')
else
//伺服器向客戶端發資訊
printf("please input char:");
fgets(snd_buf,1024,stdin);
write(new_fd,snd_buf,strlen(snd_buf));
printf("\n");
} close(new_fd);
return 0;
}int main(int argc,char *argv)
//埠的字元轉換
port=atoi(argv[1]);
//建立套接字用於伺服器的監聽
listen_fd=socket(pf_inet,sock_stream,0);
if(listen_fd<0)
memset(&srv_addr,0,sizeof(srv_addr));
//填充伺服器資訊
srv_addr.sin_family=af_inet;
srv_addr.sin_addr.s_addr=htonl(inaddr_any);
srv_addr.sin_port=htons(port);
//將伺服器和套節字繫結
ret=bind(listen_fd,(struct sockaddr *)&srv_addr,sizeof(srv_addr));
if(ret==-1)
//設定連線5個客戶端
ret=listen(listen_fd,5);
if(ret==-1)
//對每個連線來的客戶端建立乙個執行緒,單獨與其進行通訊 ,首先呼叫read函式讀取客戶端傳送來的資訊
while(1)
else
}if((pthread_create(&tid,null,thr_fn,&com_fd))==-1)//多執行緒呼叫 ,跳到thr_fn函式
}return 0;
}
Linux下的進度條小程式
乙個簡單的進度條需要兩個屬性 最大 最小範圍和步長。例如,建立乙個範圍為0到100的載入進度條,把進度條初始為0,當載入乙個資源的時候用單位長度來讓進度條前進乙個步長。1 當進度條前進時,它都會重畫自身 也就是每次從最左端開始顯示比上一次多乙個步長,就有了動態效果 那麼就需要執行一次回車,讓游標回到...
Linux下UART串列埠的測試小程式
include include include include include define baudrate b115200 define uart device dev ttys3 define false 1 define true 0 brief 設定串列埠通訊速率 param fd 型別 ...
Linux下的進度條小程式
首先,我們對makefile進行了解 make le定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作。make le就像乙個shell指令碼 樣,其中也可以執行作業系統的命令。makefile中包含依賴關係和依賴方法。當我們建立乙個t...