ubuntu下socket通信

点击打开原文链接

第一部分为C++实现,第二部分为python实现


第一部分

该socket 的功能是在客户端输入了两个浮点数组成的字符串,在服务端接受后将其转换为浮点数输出,统一时刻只能有一个客户端连接

服务端:

tcp_server.cpp

  1. #include <stdio.h>  
  2. #include <iostream>  
  3. #include <stdlib.h>  
  4. #include <netinet/in.h>  
  5. #include <unistd.h>  
  6. #include <sys/socket.h>  
  7. #include <arpa/inet.h>  
  8. #include <string.h>  
  9. using namespace std;  
  10.   
  11. #define PORT 10001  
  12.   
  13. int main()  
  14. {  
  15.     struct sockaddr_in s_in;//server address structure  
  16.     struct sockaddr_in c_in;//client address structure  
  17.     int l_fd,c_fd;  
  18.     socklen_t len;  
  19.     char buf[100];//content buff area  
  20.     string tem;  
  21.     float x_value = 0.0;  
  22.     float y_value = 0.0;  
  23.     memset((void *)&s_in,0,sizeof(s_in));  
  24.   
  25.     s_in.sin_family = AF_INET;//IPV4 communication domain  
  26.     s_in.sin_addr.s_addr = INADDR_ANY;//accept any address  
  27.     s_in.sin_port = htons(PORT);//change port to netchar  
  28.   
  29.     l_fd = socket(AF_INET,SOCK_STREAM,0);//socket(int domain, int type, int protocol)  
  30.     bind(l_fd,(struct sockaddr *)&s_in,sizeof(s_in));  
  31.     listen(l_fd,1);//同时只能有一个连接  
  32.   
  33.     cout<<"begin"<<endl;  
  34.     while(1){  
  35.         c_fd = accept(l_fd,(struct sockaddr *)&c_in,&len);  
  36.         while(1){  
  37.             for(int j=0;j<100;j++){  
  38.                 buf[j] = 0;  
  39.             }  
  40.             int n = read(c_fd,buf,100);//read the message send by client  
  41.             if(!strcmp(buf, "q\n") || !strcmp(buf, "Q\n")){  
  42.                 cout << "q pressed\n";  
  43.                 close(c_fd);  
  44.                 break;  
  45.             }  
  46.             // inet_ntop(AF_INET,&c_in.sin_addr,addr_p,16);//“二进制整数” -> “点分十进制  
  47.             tem = buf;  
  48.             x_value = atof(tem.substr(0,5).c_str());  
  49.             y_value = atof(tem.substr(5,5).c_str());  
  50.             cout << x_value << "dd" << y_value <<endl;  
  51.             write(c_fd,buf,n);//sent message back to client  
  52.         }  
  53.     }  
  54.     return 0;  
  55. }  
客户端:

tcp_client.cpp

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <iostream>  
  4. #include <stdlib.h>  
  5. #include <string>  
  6. #include <unistd.h>  
  7. #include <arpa/inet.h>  
  8. #include <sys/socket.h>  
  9. #define BUF_SIZE 100  
  10. #define ADDR "127.0.0.1" //在本机测试用这个地址,如果连接其他电脑需要更换IP  
  11. #define SERVERPORT 10001  
  12. using namespace std;  
  13. int main(int argc, char *argv[])  
  14. {  
  15.     int sock;  
  16.     char opmsg[BUF_SIZE];  
  17.     char get_msg[BUF_SIZE] = {0};  
  18.     int result, opnd_cnt, i;  
  19.     int len;  
  20.     bool if_first = true;  
  21.     struct sockaddr_in serv_addr;  
  22.   
  23.     sock = socket(PF_INET, SOCK_STREAM, 0);  
  24.     if(sock == -1){  
  25.         return -1;  
  26.     }  
  27.     memset(&serv_addr, 0, sizeof(serv_addr));  
  28.     serv_addr.sin_family = AF_INET;  
  29.     serv_addr.sin_addr.s_addr = inet_addr(ADDR);  // 注释1  
  30.     serv_addr.sin_port = htons(SERVERPORT);  
  31.     if(connect(sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1){ // 注释2  
  32.         cout << "connect error\n";  
  33.         return -1;  
  34.     }  
  35.     else{  
  36.         cout << "connected ...\n" << endl;  //注释3  
  37.     }  
  38.   
  39.     while(1){  
  40.         fgets(opmsg, BUF_SIZE, stdin);          
  41.         len = write(sock, opmsg, strlen(opmsg)); // 注释4  
  42.         if(!strcmp(opmsg, "q\n") || !strcmp(opmsg, "Q\n"))  
  43.         {  
  44.             puts("q pressed\n");  
  45.             break;  
  46.         }  
  47.         else  
  48.         {  
  49.             int read_msg = read(sock, get_msg, len);  
  50.             cout << "send length:" << len << " get:" << get_msg << endl;  
  51.         }  
  52.     }  
  53.     close(sock);  
  54.     return 0;  
  55. }  
两个放在同一个文件夹下,先编译后运行。

编译并运行服务端:

  1. g++ tcp_server.cpp -o tcp_server.out -lstdc++  
  2.   
  3. ./tcp_server.out  


打开另一个窗口编译并运行客户端:

  1. g++ tcp_client.cpp -o tcp_client.out  
  2.   
  3. ./tcp_client.out  

在客户端输入字符串例如1.2223.444按回车,服务端会将其转换为浮点数输出,!!!!!!!!注意每个浮点数带上小数点在内必须是总共五位,否则会出错!!!!!!!!!


第二部分

python的代码比较简单

serverpy

[python] view plain copy
  1. # coding=utf-8  
  2. import socket  # socket模块  
  3. import commands  # 执行系统命令模块  
  4.   
  5. HOST = '127.0.0.1'  
  6. PORT = 1234  
  7. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 定义socket类型,网络通信,TCP  
  8. s.bind((HOST, PORT))  # 套接字绑定的IP与端口  
  9. s.listen(1)  # 开始TCP监听  
  10. while 1:  
  11.     conn, addr = s.accept()  # 接受TCP连接,并返回新的套接字与IP地址  
  12.     print'Connected by', addr  # 输出客户端的IP地址  
  13.     while 1:  
  14.         data = conn.recv(100)  # 把接收的数据实例化  
  15.         print(data)  
  16.         conn.sendall(data)  
  17. conn.close()  # 关闭连接  

client.py

[python] view plain copy
  1. #  coding=utf-8  
  2.   
  3. import socket  
  4. import time  
  5.   
  6. HOST = '127.0.0.1'  
  7. PORT = 1234  
  8. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 定义socket类型,网络通信,TCP  
  9. s.connect((HOST, PORT))  # 要连接的IP与端口  
  10. while 1:  
  11.     # cmd = raw_input("Please input cmd:")  # 与人交互,输入命令  
  12.     s.sendall('this is python socket')  # 把命令发送给对端  
  13.     data = s.recv(1024)  # 把接收的数据定义为变量  
  14.     print data  # 输出变量  
  15.     time.sleep(3)  
  16. s.close()  # 关闭连接  
运行方式:打开两个终端一个运行server.py,在终端输入:python server.py

打开第二个终端,在终端输入python client.py

即可看到每隔3秒会有信息输出



  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值