Linux socket编程-最简单的服务器和客户端程序

转载自:http://blog.csdn.net/yangliuy/article/details/7420770

复习了一下Linux socket编程,写了最简单的服务器和客户端程序,测试通过,其中服务器端程序采用循环忙等待,后面会改成多线程及线程池机制

服务器端程序

[cpp]  view plain copy
  1. #include <cstdlib>  
  2. #include <iostream>  
  3. #include <cstring>  
  4. #include <cstdio>  
  5. #include <cerrno>  
  6. #include <sys/types.h>  
  7. #include <sys/socket.h>  
  8. #include <netinet/in.h>  
  9. #include <arpa/inet.h>  
  10. #include <string>  
  11.   
  12. using namespace std;  
  13. #define BACKLOG 10  
  14.   
  15. int main(int argc, char * argv[]){  
  16.     int connfd, sockfd;  
  17.     struct sockaddr_in servaddr;  
  18.     struct sockaddr_in tempaddr;  
  19.     struct sockaddr_in cliaddr;  
  20.     socklen_t clilen;  
  21.     char ip_str[INET_ADDRSTRLEN];  
  22.     int ret_val;  
  23.       
  24.     socklen_t templen;  
  25.     sockfd = socket(AF_INET, SOCK_STREAM, 0);  
  26.     if(sockfd == -1){  
  27.         perror("socket");  
  28.         exit(1);  
  29.     }  
  30.   
  31.     bzero(&servaddr, sizeof(servaddr));  
  32.     servaddr.sin_family = AF_INET;  
  33.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);  
  34.     servaddr.sin_port = 0;  
  35.       
  36.     ret_val = bind(sockfd,(struct sockaddr *)&servaddr, sizeof(servaddr));  
  37.     if(ret_val == -1){  
  38.         perror("bind");  
  39.         exit(1);  
  40.     }  
  41.     cout<< "the sockfd is "<< sockfd << endl;  
  42.     ret_val = listen(sockfd,BACKLOG);  
  43.     if(ret_val == -1){  
  44.         perror("listen");  
  45.         exit(1);  
  46.     }  
  47.   
  48.     templen = sizeof(struct sockaddr);  
  49.     ret_val =  getsockname(sockfd, (struct sockaddr *)&tempaddr, &templen);  
  50.     if(ret_val == -1){  
  51.         perror("getsockname");  
  52.         exit(1);  
  53.     }  
  54.   
  55.     cout<<"Server is listening on port "<< ntohs(tempaddr.sin_port)<<endl;  
  56.     for(;;){  
  57.         clilen = sizeof(cliaddr);  
  58.         connfd = accept(sockfd,(struct sockaddr *) &cliaddr,&clilen);  
  59.         if(connfd == -1){  
  60.             perror("accept");  
  61.             continue;  
  62.         }  
  63.         cout<< " Sever: client "<< inet_ntoa(cliaddr.sin_addr) << " connect"<<endl;  
  64.         close(connfd);  
  65.     }  
  66.     return 0;  
  67. }  


客户端程序

[cpp]  view plain copy
  1. #include <cstdlib>  
  2. #include <cstdio>  
  3. #include <cstring>  
  4. #include <sys/types.h>  
  5. #include <sys/socket.h>  
  6. #include <netinet/in.h>  
  7. #include <arpa/inet.h>  
  8. #include <unistd.h>  
  9.   
  10. #include <iostream>  
  11. using namespace std;  
  12.   
  13. int main(int argc, char * argv[]){  
  14.     int sockfd;  
  15.     int conn_ret;  
  16.     struct sockaddr_in servaddr;  
  17.     if(argc != 3){  
  18.         cout<< "Usage : client <address> <port> " <<endl;  
  19.         return 0;  
  20.     }  
  21.     sockfd = socket(AF_INET,SOCK_STREAM,0);  
  22.     if (sockfd == -1){  
  23.         perror("sock");  
  24.         exit(1);  
  25.     }  
  26.   
  27.     bzero(&servaddr,sizeof(servaddr));  
  28.     servaddr.sin_family = AF_INET;  
  29.         servaddr.sin_port = htons(atoi(argv[2]));  
  30.     inet_pton(AF_INET,argv[1],&servaddr.sin_addr);  
  31.     conn_ret = connect(sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr));  
  32.     if(conn_ret == -1){  
  33.         perror("connect");  
  34.     }  
  35.     close(sockfd);  
  36.     return 0;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值