linux——回射服务器
生活随笔
收集整理的這篇文章主要介紹了
linux——回射服务器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
回射服務器即客戶端發送一段數據給服務器,服務器再將這段數據原封不動的發送給客戶端,原理很簡單,原理圖如下:
以TCP協議為例,客戶端、服務器代碼如下:
**
服務器:
**
#include <stdio.h> #include <time.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> int main() {struct sockaddr_in server_sockaddr;memset(&server_sockaddr,0,sizeof(server_sockaddr));server_sockaddr.sin_family=AF_INET;server_sockaddr.sin_port=htons(5188);server_sockaddr.sin_addr.s_addr=htonl(INADDR_ANY);//創建一個socketint sockid=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);const int on=1;//設置重復利用端口,如果不設置在頻繁調試時會出現端口被占用情況,導致bind失敗setsockopt(sockid,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));//bindif(bind(sockid,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))<0){printf("bind\n");return 0;}//listenif(listen(sockid,SOMAXCONN)<0){printf("listen\n");return 0;}//獲得連接的客戶端信息struct sockaddr_in client_sockaddr;socklen_t client_socklen=sizeof(client_sockaddr);//acceptint client_sock=accept(sockid,(struct sockaddr *)&client_sockaddr,&client_socklen);//打印所連接客戶端ip及端口printf("ip=%s,port=%d\n",inet_ntoa(client_sockaddr.sin_addr),ntohs(client_sockaddr.sin_port));char receive[100]={0};int r_size=0;while(1){//獲取時間,即服務器接收數據的時間time_t timep;time(&timep);memset(receive,0,sizeof(receive));//讀取數據,如果沒有讀到就等待,因為此時read阻塞,如果客戶端關閉read立即返回0if((r_size=read(client_sock,receive,sizeof(receive)))==0){break;}fputs(ctime(&timep),stdout);fputs(receive,stdout);printf("\n");//將讀取到的數據在發給客戶端write(client_sock,receive,r_size);}close(client_sock);close(sockid);return 0; }客戶端:
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> int main() {struct sockaddr_in sock;memset(&sock,0,sizeof(sock));sock.sin_family=AF_INET;sock.sin_port=htons(5188);sock.sin_addr.s_addr=inet_addr("127.0.0.1");//創建一個socketint sockid=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);socklen_t socklen=sizeof(sock);//connectconnect(sockid,(struct sockaddr *)&sock,socklen);char send[100]={0};char receive[100]={0};while(1){printf("發送: ");//從標準輸入獲取一段數據fgets(send,sizeof(send),stdin);//將這段數據發送給服務器write(sockid,send,strlen(send));printf("接受: ");//讀取來自服務器傳回來的數據read(sockid,receive,sizeof(receive));fputs(receive,stdout);//將這兩個數組清零memset(receive,0,strlen(receive));memset(send,0,strlen(send));}close(sockid);return 0; }總結
以上是生活随笔為你收集整理的linux——回射服务器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将本地项目上传到码云(gitee)远程仓
- 下一篇: 负数在计算机中如何表示?