ubuntu下socket通信

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/deyuzhi/article/details/51725074

第一部分为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秒会有信息输出


展开阅读全文

没有更多推荐了,返回首页