linux c++ socket入门之tcp server端

来源:互联网 发布:c语言如何生成exe文件 编辑:程序博客网 时间:2024/06/07 17:52
http://blog.csdn.net/jom_ch/article/details/7852491

tcp_server.h
[cpp] view plaincopy
  1. #include <unistd.h>  
  2. #include <iostream>  
  3. #include <sys/socket.h>  
  4. #include <arpa/inet.h>  
  5.   
  6. #define MAXSIZE 1024  
  7.   
  8. class tcp_server  
  9. {  
  10. private:  
  11.         int socket_fd,accept_fd;  
  12.         sockaddr_in myserver;  
  13.         sockaddr_in remote_addr;  
  14.   
  15. public:  
  16.         tcp_server(int listen_port);  
  17.         int recv_msg();  
  18. };  


tcp_server.cpp

[cpp] view plaincopy
  1. #include "tcp_server.h"  
  2.   
  3. tcp_server::tcp_server(int listen_port) {  
  4.   
  5.         if(( socket_fd = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0 ){  
  6.                 throw "socket() failed";  
  7.         }  
  8.   
  9.         memset(&myserver,0,sizeof(myserver));  
  10.         myserver.sin_family = AF_INET;  
  11.         myserver.sin_addr.s_addr = htonl(INADDR_ANY);  
  12.         myserver.sin_port = htons(listen_port);  
  13.   
  14.         if( bind(socket_fd,(sockaddr*) &myserver,sizeof(myserver)) < 0 ) {  
  15.                 throw "bind() failed";  
  16.         }  
  17.   
  18.         if( listen(socket_fd,10) < 0 ) {  
  19.                 throw "listen() failed";  
  20.         }  
  21. }  
  22.   
  23. int tcp_server::recv_msg() {  
  24.   
  25.         while( 1 ) {  
  26.   
  27.                 socklen_t sin_size = sizeof(struct sockaddr_in);  
  28.                 if(( accept_fd = accept(socket_fd,(struct sockaddr*) &remote_addr,&sin_size)) == -1 )  
  29.                 {  
  30.                         throw "Accept error!";  
  31.                         continue;  
  32.                 }  
  33.                 printf("Received a connection from %s\n",(char*) inet_ntoa(remote_addr.sin_addr));  
  34.   
  35.                 if( !fork() ) {  
  36.                         char buffer[MAXSIZE];  
  37.                         memset(buffer,0,MAXSIZE);  
  38.                         if( ( read(accept_fd,buffer,MAXSIZE)) < 0 ) {  
  39.                                 throw("Read() error!");  
  40.                         } else {  
  41.                                 printf("Received message: %s\n",buffer);  
  42.                                 break;  
  43.                         }  
  44.                         exit(0);  
  45.                 }  
  46.                 close(accept_fd);  
  47.         }  
  48.         return 0;  
  49. }  


main.cpp

[cpp] view plaincopy
  1. #include <iostream>  
  2. #include <tcp_server.h>  
  3.   
  4. int main(int argc,char* argv[])  
  5. {  
  6.         tcp_server ts(atoi(argv[1]));  
  7.         ts.recv_msg();  
  8.         return 0;  
  9. }  

 

编译
[cpp] view plaincopy
  1. g++ -c tcp_server.cpp -o tcp_server.o  
  2. g++ -g tcp_server.o main.cpp -I. -o main  


 运行

[cpp] view plaincopy
  1. ./main 9527  


客户端测试

[cpp] view plaincopy
  1. telnet server_ip 9527  


服务器端响应

[cpp] view plaincopy
  1. client(IP:192.168.99.1) connected.  

 

0 0