ubuntu下socket通信

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


第一部分

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

服务端:

tcp_server.cpp

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <netinet/in.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
using namespace std;

#define PORT 10001

int main()
{
    struct sockaddr_in s_in;//server address structure
    struct sockaddr_in c_in;//client address structure
    int l_fd,c_fd;
    socklen_t len;
    char buf[100];//content buff area
    string tem;
    float x_value = 0.0;
    float y_value = 0.0;
    memset((void *)&s_in,0,sizeof(s_in));

    s_in.sin_family = AF_INET;//IPV4 communication domain
    s_in.sin_addr.s_addr = INADDR_ANY;//accept any address
    s_in.sin_port = htons(PORT);//change port to netchar

    l_fd = socket(AF_INET,SOCK_STREAM,0);//socket(int domain, int type, int protocol)
    bind(l_fd,(struct sockaddr *)&s_in,sizeof(s_in));
    listen(l_fd,1);//同时只能有一个连接

    cout<<"begin"<<endl;
    while(1){
        c_fd = accept(l_fd,(struct sockaddr *)&c_in,&len);
        while(1){
            for(int j=0;j<100;j++){
                buf[j] = 0;
            }
            int n = read(c_fd,buf,100);//read the message send by client
            if(!strcmp(buf, "q\n") || !strcmp(buf, "Q\n")){
                cout << "q pressed\n";
                close(c_fd);
                break;
            }
            // inet_ntop(AF_INET,&c_in.sin_addr,addr_p,16);//“二进制整数” -> “点分十进制
            tem = buf;
            x_value = atof(tem.substr(0,5).c_str());
            y_value = atof(tem.substr(5,5).c_str());
            cout << x_value << "dd" << y_value <<endl;
            write(c_fd,buf,n);//sent message back to client
        }
    }
    return 0;
}
客户端:

tcp_client.cpp

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 100
#define ADDR "127.0.0.1" //在本机测试用这个地址,如果连接其他电脑需要更换IP
#define SERVERPORT 10001
using namespace std;
int main(int argc, char *argv[])
{
    int sock;
    char opmsg[BUF_SIZE];
    char get_msg[BUF_SIZE] = {0};
    int result, opnd_cnt, i;
    int len;
    bool if_first = true;
    struct sockaddr_in serv_addr;

    sock = socket(PF_INET, SOCK_STREAM, 0);
    if(sock == -1){
        return -1;
    }
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr(ADDR);  // 注释1
    serv_addr.sin_port = htons(SERVERPORT);
    if(connect(sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1){ // 注释2
        cout << "connect error\n";
        return -1;
    }
    else{
        cout << "connected ...\n" << endl;  //注释3
    }

    while(1){
        fgets(opmsg, BUF_SIZE, stdin);        
        len = write(sock, opmsg, strlen(opmsg)); // 注释4
        if(!strcmp(opmsg, "q\n") || !strcmp(opmsg, "Q\n"))
        {
            puts("q pressed\n");
            break;
        }
        else
        {
            int read_msg = read(sock, get_msg, len);
            cout << "send length:" << len << " get:" << get_msg << endl;
        }
    }
    close(sock);
    return 0;
}
两个放在同一个文件夹下,先编译后运行。

编译并运行服务端:

g++ tcp_server.cpp -o tcp_server.out -lstdc++

./tcp_server.out


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

g++ tcp_client.cpp -o tcp_client.out

./tcp_client.out

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


第二部分

python的代码比较简单

serverpy

# coding=utf-8
import socket  # socket模块
import commands  # 执行系统命令模块

HOST = '127.0.0.1'
PORT = 1234
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 定义socket类型,网络通信,TCP
s.bind((HOST, PORT))  # 套接字绑定的IP与端口
s.listen(1)  # 开始TCP监听
while 1:
    conn, addr = s.accept()  # 接受TCP连接,并返回新的套接字与IP地址
    print'Connected by', addr  # 输出客户端的IP地址
    while 1:
        data = conn.recv(100)  # 把接收的数据实例化
        print(data)
        conn.sendall(data)
conn.close()  # 关闭连接

client.py

#  coding=utf-8

import socket
import time

HOST = '127.0.0.1'
PORT = 1234
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 定义socket类型,网络通信,TCP
s.connect((HOST, PORT))  # 要连接的IP与端口
while 1:
    # cmd = raw_input("Please input cmd:")  # 与人交互,输入命令
    s.sendall('this is python socket')  # 把命令发送给对端
    data = s.recv(1024)  # 把接收的数据定义为变量
    print data  # 输出变量
    time.sleep(3)
s.close()  # 关闭连接
运行方式:打开两个终端一个运行server.py,在终端输入:python server.py

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

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


  • 5
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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.csdn.net/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.csdn.net/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 ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值