實驗要求
客戶端輸入「quit」,客戶端程式與伺服器端程式列印退出資訊,終止程式的執行;
客戶輸入命令,客戶端將命令通過流套接字傳送給客戶端,伺服器執行收到的命令,並將結果傳送到客戶端顯示;
如果沒有客戶輸入的命令,伺服器傳送命令非法資訊,並在客戶端顯示該條資訊;
伺服器端可以接收客戶端多次連線,能夠處理客戶端非正常退出。
實驗環境
red hat 9
**tcpserver.c
#include
#include
#include
#include
#include
#include
#include
#include
#define port 8900
#define buf_size 2048
intexecute
(char
* command,
char
* buf)
;int
main()
memset
(&server,0,
sizeof
(struct sockaddr_in));
server.sin_family = af_inet;
server.sin_addr.s_addr =
htonl
(inaddr_any)
; server.sin_port =
htons
(port);if
(-1==
bind
(sockfd,
(struct sockaddr*
)&server,
sizeof
(struct sockaddr)))
if(-1
==listen
(sockfd,10)
) length =
sizeof
(struct sockaddr_in)
;while(1
)while(1
)//change
recv_buf[recvnum]
='\0';if
(0==strcmp
(recv_buf,
"quit"))
//attention!!!
strcpy
(cmd,
"/bin/");
strcat
(cmd,recv_buf)
;execute
(cmd,send_buf);if
('\0'
==*send_buf)if(
'\0'
==*send_buf)}if
('\0'
==*send_buf)
sprintf
(send_buf,
"command is not vaild,check it please\n");
printf
("%s\n"
,send_buf)
; sendnum =
send
(connected,send_buf,
sizeof
(send_buf),0
);//changeif(
0>sendnum)
}close
(connected);}
close
(sockfd)
;exit(1
);}int
execute
(char
* command,
char
* buf)
count =0;
while((
(buf[count]
=fgetc
(fp))!=
eof)
&&count<
2047
) count++
; buf[count]
='\0'
;pclose
(fp);if
(0==count)
printf
(buf,
"%s cannot execute\n"
,command)
;return count;
}
tcpclient.c#include
#include
#include
#include
#include
#include
#include
#define port 8900
#define buf_size 2048
void
print_usage
(char
* str)
intmain
(int argc,
char
** ar**)
memset
(send_buf,0,
2048);
memset
(recv_buf,0,
2048);
port = port;if(
-1==(sockfd=
socket
(af_inet,sock_stream,0)
))// change
memset
(&server,0,
sizeof
(struct sockaddr_in)
);
server.sin_family = af_inet;
server.sin_addr.s_addr =
inet_addr
(ar**[1]
);server.sin_port =
htons
(port);if
(-1==
connect
(sockfd,
(struct sockaddr*
)&server,
sizeof
(server)))
//change
while(1
)if(0
==strcmp
(send_buf,
"quit"))
length =
sizeof
(struct sockaddr)
; recvnum =
recv
(sockfd,recv_buf,
2048,0
);if(
0//change
else
}close
(sockfd)
;exit(1);}
執行結果
將服務端與客戶端啟動,本實驗中黑底是服務端,白底是客戶端,編譯後的可執行檔案分別命名為 tcpserver 和 tcpclient
先測試命令ls,在客戶端輸入ls回車,傳到服務端執行命令,然後服務端將結果返回給客戶端並顯示在控制台,如下兩圖:
再測試whoami命令,客戶端輸入whoami,傳到服務端執行,然後服務端將結果返回給客戶端並顯示在控制台,如下兩圖:
測試命令ctrl+c,在客戶端按ctrl+c,客戶端斷開連線退出程式,但服務端仍執行著。之後再重新啟動客戶端,重新連線,如下兩圖:
測試命令quit,客戶端輸入quit,兩邊都退出程式,如下兩圖
乙個簡單的TCP套接字程式設計例項
採用乙個伺服器程式對應乙個客戶的方法,伺服器不需要採取任何併發技術,執行tcp套接字服務端的基本過程是建立套接字,繫結套接字,監聽,接收請求,讀 寫資料和終止連線。伺服器源程式 include include include include include include include inclu...
利用boost asio實現乙個簡單的伺服器框架
boost asio是乙個高效能的網路開發庫,windows下使用iocp,linux下使用epoll。與 不同的是,它並沒有提供乙個網路框架,而是採取元件的方式來提 用介面。但是對於常見的情況,採用乙個好用的框架還是能夠簡化開發過程,特別是asio的各個非同步介面的用法都相當類似。受到 sp se...
利用陣列實現乙個簡單的棧
package com.stack 用陣列實現乙個簡單的棧 方法 壓入元素 push 彈出棧頂元素 pop 棧的大小 size 棧是否為空 isempty public class arraytostack 向棧中新增元素 param item public void push item item ...