C 语言 实现的socket 通信

Server端:

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2. #include <sys/socket.h>  
  3. #include <netinet/in.h>  
  4. #include <arpa/inet.h>  
  5. #include <netdb.h>  
  6. #include <string.h>  
  7. #include <stdlib.h>  
  8.   
  9.   
  10.   
  11. int serverPort = 8000;  
  12.   
  13. int main()  
  14. {  
  15.     struct sockaddr_in listeningSockAddr;  
  16.     struct sockaddr_in clientSockAddr;  
  17.     int clientAddrSize;  
  18.   
  19.     int listeningSock;  
  20.     int comunicateSock;  
  21.   
  22.   
  23.     char clientStr[100],str1[20],str2[20],str3[20];  
  24.     char toClientBuf[100];  
  25.     int clientStrLen,toClientBufLen;  
  26.     float c;  
  27.     //建立socket  
  28.     listeningSock =socket(AF_INET,SOCK_STREAM,0);  
  29.     if(listeningSock == -1){  
  30.         perror("socket failed");  
  31.         exit(1);  
  32.     }  
  33.   
  34.     //建立IPv4地址  
  35.     bzero(&listeningSockAddr,sizeof(listeningSockAddr));  
  36.     listeningSockAddr.sin_family = AF_INET;  
  37.     listeningSockAddr.sin_addr.s_addr = htonl(INADDR_ANY);//监听所有ip地址  
  38.     listeningSockAddr.sin_port = htons(serverPort);  
  39.   
  40.     //绑定socket  
  41.     if(bind(listeningSock,(struct sockaddr *)&listeningSockAddr,sizeof(listeningSockAddr)) == -1){  
  42.         perror("bind failed");  
  43.         exit(1);  
  44.     }  
  45.   
  46.     //监听client端  
  47.     if(listen(listeningSock,20) == -1){  
  48.         perror("call to listen");  
  49.         exit(1);  
  50.     }  
  51.       
  52.       
  53.     while(1){  
  54.         printf("Accepting connections ... \n");  
  55.         //接受Client端连接  
  56.         comunicateSock = accept(listeningSock,(struct sockaddr*)&clientSockAddr,&clientAddrSize);//如果不再乎客户端的ip,那第二,三个参数可设为NULL  
  57.   
  58.         if(comunicateSock == -1){  
  59.             perror("accept failed");  
  60.             exit(1);  
  61.         }  
  62.   
  63.         printf("客户端的ip:%s,端口号:%d\n",inet_ntoa(clientSockAddr.sin_addr),clientSockAddr.sin_port);  
  64.   
  65.   
  66.         //接收client端传来的信息  
  67.         clientStrLen = recv(comunicateSock,clientStr,100,0);  
  68.         clientStr[clientStrLen] = '\0';  
  69.   
  70.         printf("Received %d characters from client,the string is:%s\n",clientStrLen,clientStr);  
  71.   
  72.         //分析处理Client端传来的信息  
  73.         if(clientStrLen > 0){  
  74.             strcpy(str1,strtok(clientStr," "));  
  75.             printf("第1个字符串为:%s\n",str1);  
  76.             strcpy(str2,strtok(NULL," "));  
  77.             printf("第2个字符串为:%s\n",str2);  
  78.             strcpy(str3,strtok(NULL," "));  
  79.             printf("第3个字符串为:%s\n",str3);  
  80.             c = atof(str3)*1.05;  
  81.             sprintf(toClientBuf,"商 品 号 为  %s \n商 品 名 为  %s\n含 税 价 为  %.2f\n",str1,str2,c);  
  82.         }  
  83.         //将处理过的信息返回给Client端  
  84.         toClientBufLen = strlen(toClientBuf);  
  85.         if(send(comunicateSock,toClientBuf,toClientBufLen,0) == -1){  
  86.             perror("call to send");  
  87.             exit(1);  
  88.         }  
  89.         //关闭与Client端的连接  
  90.         close(comunicateSock);  
  91.     }  
  92.     return 0;  
  93. }  

client端:

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <sys/types.h>  
  5. #include <sys/socket.h>  
  6. #include <netinet/in.h>  
  7. #include <arpa/inet.h>  
  8. #include <netdb.h>  
  9.   
  10. int serverPort = 8000;  
  11.   
  12. int main(int argc,char *argv[])  
  13. {  
  14.     struct sockaddr_in serverSock;  
  15.     int bindingServerAddrSock;  
  16.     char buf[8192];  
  17.     char *str = "A001 电视机 20000.00";  
  18.   
  19.     printf("使用方法:client 字符串\n");  
  20.   
  21.     if(argc < 2){  
  22.         printf("argc < 2,使用默认字符串\n");  
  23.     }  
  24.     else{  
  25.         str = argv[1];  
  26.     }  
  27.   
  28.     /*建立Server IPv4地址 */  
  29.     bzero(&serverSock,sizeof(serverSock));  
  30.     serverSock.sin_family = AF_INET;  
  31.     serverSock.sin_addr.s_addr = inet_addr("127.0.0.1");  
  32.     serverSock.sin_port = htons(serverPort);  
  33.   
  34.     /* 建立Socket */  
  35.     bindingServerAddrSock = socket(AF_INET,SOCK_STREAM,0);  
  36.     if(bindingServerAddrSock == -1){  
  37.         perror("socket failed");  
  38.         exit(1);  
  39.     }  
  40.   
  41.     /*连接Server */  
  42.     if(connect(bindingServerAddrSock,(void *)&serverSock,sizeof(serverSock)) == -1){  
  43.         perror("connect failed");  
  44.         exit(1);  
  45.     }  
  46.     /*将str字符串传给 Server */  
  47.     printf("Sending message %s to server ...\n",str);  
  48.   
  49.     if(send(bindingServerAddrSock,str,strlen(str),0) == -1){  
  50.     perror("error in sending\n");  
  51.     exit(1);  
  52.     }  
  53.       
  54.     /*接收Server回传的信息 */  
  55.     if(recv(bindingServerAddrSock,buf,8192,0) == -1){  
  56.     perror("Error in receiving");  
  57.     exit(1);  
  58.     }  
  59.   
  60.     printf("\nResponse these from server :%s\n",buf);  
  61.     close(bindingServerAddrSock);  
  62.     return 0;  
  63. }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值