socket编程---服务器端与客户端简单通信

 服务器端:

[cpp]  view plain  copy
 print ?
  1. /*  
  2.  * File:   main.cpp 
  3.  * Author: xiaomo 
  4.  * 
  5.  * Created on 2011年6月22日, 下午8:07 
  6.  */  
  7. #include<stdio.h>  
  8. #include <stdlib.h>  
  9. #include <errno.h>  
  10. #include <string.h>  
  11. #include <netdb.h>  
  12. #include <sys/types.h>  
  13. #include <netinet/in.h>  
  14. #include <sys/socket.h>  
  15. #include<unistd.h>   
  16. #include<arpa/inet.h>  
  17. #include <time.h>  
  18.   
  19. #define SERVER_PORT 2222 // define the defualt connect port id  
  20. #define LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server  
  21. #define BUFFER_SIZE 10485760  
  22. #define WELCOME_MESSAGE "welcome to connect the server. "  
  23.   
  24. ssize_t Read(int sockfd, char* recv, size_t bytes)  
  25. {  
  26.     size_t nleft;  
  27.     ssize_t nread;  
  28.       
  29.     char *ptr = recv;  
  30.     nleft = bytes;  
  31.     while(nleft > 0)  
  32.     {  
  33.         if((nread = read(sockfd, ptr, nleft)) < 0)  
  34.         {  
  35.            if(errno == EINTR)  
  36.                nread = 0;  
  37.            else  
  38.                return -1;             
  39.         }  
  40.         else if(nread == 0)  
  41.             break;  
  42.         nleft -= nread;  
  43.         ptr += nread;  
  44.     }  
  45.     return(bytes - nleft);  
  46. }  
  47.   
  48. ssize_t Write(int sockfd, char* send, size_t bytes)  
  49. {  
  50.     size_t nleft;  
  51.     ssize_t nwritten;  
  52.     char* ptr = send;  
  53.     nleft = bytes;  
  54.     while(nleft > 0)  
  55.     {  
  56.         if((nwritten = write(sockfd, ptr, nleft)) <= 0)  
  57.         {  
  58.             if(nwritten < 0 && errno == EINTR)  
  59.                 nwritten = 0;  
  60.             else  
  61.                 return -1;  
  62.         }  
  63.         nleft -= nwritten;  
  64.         ptr += nwritten;  
  65.     }  
  66.     return bytes;  
  67. }  
  68.   
  69. int main(int argc, char **argv)  
  70. {  
  71.        int servfd,clifd;  
  72.        struct sockaddr_in servaddr,cliaddr;   
  73.        int recvbytes;  
  74.   
  75.        if ((servfd = socket(AF_INET,SOCK_STREAM,0)) < 0)  
  76.        {//建立Socket,程序调用Socket函数,该函数返回一个类似于文件描述符的句柄  
  77.               printf("create socket error!n");  
  78.               exit(1);  
  79.        }  
  80.        //sin_zero用来将sockaddr_in结构填充到与struct sockaddr同样的长度,可以用bzero()或memset()函数将其置为零  
  81.        bzero(&servaddr,sizeof(servaddr));  
  82.        servaddr.sin_family = AF_INET;  
  83.        servaddr.sin_port = htons(SERVER_PORT);  
  84.        servaddr.sin_addr.s_addr = htons(INADDR_ANY);/*系统自动填入本机IP地址 */  
  85.   
  86.        if (bind(servfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)  
  87.        {//服务端通过调用 bind函数来配置本地信息。Bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。           
  88.               printf("bind to port %d failure!n",SERVER_PORT);  
  89.               exit(1);  
  90.        }  
  91.   
  92.        if (listen(servfd,LENGTH_OF_LISTEN_QUEUE) < 0)  
  93.        {//Listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。  
  94.               printf("call listen failure!n");  
  95.               exit(1);  
  96.        }   
  97.        while (1)  
  98.        {//server loop will nerver exit unless any body kill the proces  
  99.               long timestamp;  
  100.               socklen_t length = sizeof(cliaddr);  
  101.               //accept()函数让服务器接收客户的连接请求  
  102.               clifd = accept(servfd,(struct sockaddr*)&cliaddr,&length);  
  103.               if (clifd < 0)  
  104.               {  
  105.                      printf("error comes when call accept!n");  
  106.                      break;  
  107.               }  
  108.               char* buf = new char[BUFFER_SIZE];  
  109.               strcpy(buf,WELCOME_MESSAGE);  
  110.               //inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE);  
  111.                
  112.               printf("from client,IP:%s,Port:%dn",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));  
  113.               timestamp = time(NULL);  
  114.               strcat(buf,"/ntimestamp in server:");  
  115.               strcat(buf,ctime(×tamp));  
  116.               //Send()函数返回实际上发送出的字节数,可能会少于你希望发送的数据  
  117.               Write(clifd,buf,BUFFER_SIZE);  
  118.                 
  119.               if ((recvbytes=Read(clifd, buf, BUFFER_SIZE)) ==-1) {  
  120.                   perror("recv出错!");  
  121.                   exit(1);  
  122.               }  
  123.               buf[recvbytes]='/0';  
  124.               printf("/nReceived from Client: %s",buf);  
  125.               delete []buf;  
  126.               close(clifd);                         
  127.        }//exit  
  128.        close(servfd);  
  129.   
  130.        return 0;  
  131.   
  132. }  
客户端:
[cpp]  view plain  copy
 print ?
  1. /*  
  2.  * File:   main.cpp 
  3.  * Author: xiaomo 
  4.  * 
  5.  * Created on 2011年6月18日, 下午6:38 
  6.  */  
  7. #include<stdio.h>  
  8. #include <stdlib.h>  
  9. #include <errno.h>  
  10. #include <string.h>  
  11. #include <netdb.h>  
  12. #include <sys/types.h>  
  13. #include <netinet/in.h>  
  14. #include <sys/socket.h>  
  15. #include<unistd.h>   
  16. #include<arpa/inet.h>   
  17. #define SERVPORT 2222  
  18. #define MAXDATASIZE 1024 /*每次最大数据传输量 */  
  19. #define BUFFER_SIZE 255  
  20. #define FROMCLIENT "Hi,I'm client./n"  
  21.   
  22. int main(int argc, char *argv[]){  
  23.     int sockfd, recvbytes;  
  24.     char buf[MAXDATASIZE];  
  25. //    char server_ip[64];  
  26.     struct sockaddr_in serv_addr;  
  27.   //  fgets(server_ip,BUFSIZ,stdin);  //从键盘输入数据  
  28.    
  29.     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){  
  30.         perror("error!");  
  31.         exit(1);  
  32.     }  
  33.     serv_addr.sin_family=AF_INET;  
  34.     serv_addr.sin_port=htons(SERVPORT);  
  35.     serv_addr.sin_addr.s_addr = htons(INADDR_ANY);//inet_addr(server_ip)  
  36.     bzero(&(serv_addr.sin_zero),8);  
  37.     if (connect(sockfd, (struct sockaddr *)&serv_addr,  
  38.             sizeof(struct sockaddr)) == -1) {  
  39.         perror("connect出错!");  
  40.         exit(1);  
  41.     }  
  42.     if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1) {  
  43.         perror("recv出错!");  
  44.         exit(1);  
  45.     }  
  46.     buf[recvbytes] = '/0';  
  47.     printf("/nReceived from Server: %s",buf);  
  48.     strcpy(buf,FROMCLIENT);  
  49.     send(sockfd,buf,BUFFER_SIZE,0);        
  50.     close(sockfd);  
  51.       
  52.     return 0;  
  53. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值