生活随笔
收集整理的這篇文章主要介紹了
Linux C++ 回射服务器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://blog.csdn.net/qq_25425023/article/details/53914820
回射服務器就是服務端將客戶端的數據發送回去。
??
? 我實現的回射服務器返回增加了時間。
? 服務端代碼,可以很容易看懂:
?
[cpp]?view plain
?copy#include?<sys/socket.h>??#include?<stdio.h>??#include?<string.h>??#include?<sys/types.h>??#include?<netinet/in.h>??#include?<time.h>??#include?<unistd.h>??#include?<arpa/inet.h>??#include?<stdlib.h>????#include?"../thread_pool.h"??//在上一篇博客中????#define?MAX_BUFFER?512????typedef?struct?sockaddr?SSA;????char?timebuffer[50];????char?readbuffer[MAX_BUFFER];?????time_t?tick;????class?task??{??private:??????int?connfd;????public:??????task(int?conn)?:?connfd(conn)??????{??????}??????~task(){}????????void?doit()????????{??????size_t?readsize;??????while((readsize?=?read(connfd,?readbuffer,?MAX_BUFFER))?>?0)????????{??????????printf("%ld?get?%dbyte\n",(unsigned?long)pthread_self()???????????,?(int)readsize);?????????????if(readsize?==?-1)????????????{??????????printf("errno?is?%s\n",?strerror(errno));???????????continue;??????????}??????????readbuffer[readsize]?=?'\0';???????????tick?=?time(NULL);???????????????snprintf(timebuffer,?sizeof(timebuffer),?"time?:?%.24s\r\n",???????????ctime(&tick));??????????strcat(readbuffer,?timebuffer);??????????????????????write(connfd,?readbuffer,?strlen(readbuffer));????????}????????????close(connfd);??????}??};????int?main(int?argc,?char?*argv[])??{??????if(argc?!=?2)??????{??????printf("uasge?:?%s?port",?argv[0]);??????exit(-1);??????}??????int?sockfd,?connfd;??????struct?sockaddr_in?serv_addr,?cli_addr;??????int?port?=?atoi(argv[1]);????????????serv_addr.sin_family?=?AF_INET;??????serv_addr.sin_port?=?htons(port);??????serv_addr.sin_addr.s_addr?=?htonl(INADDR_ANY);??????????????sockfd?=?socket(AF_INET,?SOCK_STREAM,?0);??????if(sockfd?<?0)??????{??????printf("socket?error'?n");??????exit(-1);??????}????????????bind(sockfd,?(SSA?*)&serv_addr,?sizeof(serv_addr));????????????listen(sockfd,?6);????????????threadpool<task>?pool(60,?100);??????pool.start();????????while(1)??????{??????socklen_t?len?=?sizeof(cli_addr);??????connfd?=?accept(sockfd,?(SSA?*)&cli_addr,?&len);????????task?*ta?=?new?task(connfd);?????????char?buf[20];??????printf("IP?%s?conn\n",?inet_ntop(AF_INET,?&cli_addr.sin_addr,?buf,???????????sizeof(buf)));??????????while(!pool.append_task(ta))????????????printf("loop\n");???????}??????return?0;??}??
下面的是客戶端的代碼:
[cpp]?view plain
?copy#include?<stdio.h>??#include?<sys/socket.h>??#include?<arpa/inet.h>??#include?<string.h>??#include?<sys/types.h>??#include?<unistd.h>??#include?<netinet/in.h>??#include?<stdlib.h>????int?main(int?argc,?char?*argv[])??{??????if(argc?!=?3)???????{??????printf("usage:?%s?ip?port\n",?argv[0]);??????exit(-1);??????}??????int?sockfd;??????struct?sockaddr_in?serv_addr;??????int?port?=?atoi(argv[2]);??????????????serv_addr.sin_family?=?AF_INET;??????serv_addr.sin_port?=?htons(port);????????inet_pton(AF_INET,?argv[1],?&serv_addr.sin_addr);????????????sockfd?=?socket(AF_INET,?SOCK_STREAM,?0);????????????connect(sockfd,?(struct?sockaddr?*)&serv_addr,???????????sizeof(serv_addr));??????char?buffer[50];??????write(sockfd,?"hello\n",?6);????????shutdown(sockfd,?SHUT_WR);????????size_t?num?=?read(sockfd,?buffer,?sizeof(buffer));????????buffer[num]?=?'\0';??????printf("read:?%s\n",?buffer);??????shutdown(sockfd,?SHUT_RD);????????return?0;??}??
客戶端一開始我使用的是最后來個close的,就是注釋那部分,但是多個連接同時來的時候,服務端會出錯,具體的出錯信息是:Connection reset by peer,重新執行read之后,得到Hello的個數沒有少,也就是客戶端發送的個數。
然而我客戶端寫完數據,就關閉寫端,讀取完數據,再關閉讀端,就不會出現這樣的錯誤。
具體原因還不是很清楚,網上沒有查找到具體的答案。求大神來解答!!~~
==============================================
終于知道原因了,出錯的是在服務端的read函數,read返回-1,而在客戶端,發送完數據,就shutdown寫端,發送完數據,就會發送FIN包,服務端read返回0,因為read不止被調用一次,第一次讀取完數據之后,繼續讀取,可是客戶端沒有數據可讀,就會出錯,而提前關閉客戶端寫端,所以read那里的WHILE退出,就沒有了出錯的信息。
同時寫了兩個shell文件來測試:
[html]?view plain
?copy#!/bin/bash????for?i?in?`seq?2000`???do??????./client.out?127.0.0.1?8989??done??
循環 執行2000次。
第二個shell文件:
[html]?view plain
?copy#!/bin/bash????./loop.sh?>?file1?&??./loop.sh?>?file2?&??./loop.sh?>?file3?&??./loop.sh?>?file4?&??./loop.sh?>?file5?&??wait??
開啟5個進程來返問。
執行第二個shell文件
最終,耗時為:
[html]?view plain
?copyreal????0m7.589s??user????0m0.460s??sys?0m1.944s??
而且五個File文件中,有Hello的行數數都為2000.
下一篇是實現一個簡單小型的web服務器。
總結
以上是生活随笔為你收集整理的Linux C++ 回射服务器的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。