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秒会有信息输出



Ubuntu上进行socket通信需要使用Python的socket模块。首先,你需要在客户端和服务器端分别创建socket对象,并指定通信的IP地址和端口号。然后,你可以使用`connect()`方法在客户端连接到服务器端的IP地址和端口号。接下来,你可以使用`sendall()`方法发送数据给服务器端,并使用`recv()`方法接收服务器端发来的数据。最后,记得关闭连接。在服务器端,你需要使用`bind()`方法绑定服务器的IP地址和端口号,并使用`listen()`方法开始监听。接收到客户端的连接后,使用`accept()`方法接受连接并返回一个新的套接字对象和客户端的IP地址。一旦连接建立,你可以使用该套接字对象的`sendall()`方法将数据发送给客户端,并使用`recv()`方法接收客户端发来的数据。最后,记得关闭连接。 在示例代码中,`client.py`和`server.py`分别是客户端和服务器端的代码。在运行时,首先在终端运行`server.py`,然后在另一个终端运行`client.py`。这样就可以实现socket通信。 另外,如果你需要在Ubuntu上提升数据传输的实时性和稳定性,可以考虑使用巨帧(jumbo frame)来扩大最大传输单元(MTU)。你可以通过设置MTU的值为9000来实现,可以使用以下命令设置:`ifconfig eth0 mtu 9000`。请注意,每次开机都需要重新设置,你可以考虑设置开机自启动脚本。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ubuntusocket通信](https://blog.youkuaiyun.com/qq_31918961/article/details/80575462)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Linux/Ubuntu下多机间基于socket通信进行数据交互及C++代码实现](https://blog.youkuaiyun.com/qq_42091428/article/details/124515952)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值