linux与windows通信

我用的linux系统是ubuntu14.04,windows系统是windows 10,两个电脑之间通过网线连接.
连接的时候最好关闭系统的防火墙,否则会出现问题,两个系统都要关闭防火墙.
ubuntu关闭防火墙的方法是,在命令行输入 : sudo ufw disable 接着输入密码就可以.
windows关闭防火墙的方法是,在控制面板找到系统和安全,然后再找到windows防火墙,在左侧找到启用或关闭windows防火墙 ,全部关闭即可.
运行的时候,在ubuntu系统上,先编译gcc server.c -o server ,然后运行./server ,然后在windows系统运行代码,windows端我用的是vs2017,接下来windows这边输入什么,ubuntu那边就会输出什么.
注意:一定要先运行ubuntu的代码,然后再运行winodws的代码.
linux端的代码:

#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define HELLO_WORLD_SERVER_PORT    4000
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024

int main(int argc, char **argv)
{
    struct sockaddr_in server_addr;
        int server_socket;
        int opt = 1;

    bzero(&server_addr,sizeof(server_addr));

    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);
    server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);

        /* create a socket */
    server_socket = socket(PF_INET,SOCK_STREAM,0);
    if( server_socket < 0)
    {
        printf("Create  Failed!");
        exit(1);
    }

    /* bind socket to a specified address*/
    setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
    if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
    {
        printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
        exit(1);
    }

    /* listen a socket */
    if(listen(server_socket, LENGTH_OF_LISTEN_QUEUE))
    {
        printf("Server Listen Failed!");
        exit(1);
    }

        /* run server */
    while (1)
    {
        struct sockaddr_in client_addr;
                int client_socket;
        socklen_t length;
                char buffer[BUFFER_SIZE];

                /* accept socket from client */
                length = sizeof(client_addr);
        client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);
        if( client_socket < 0)
        {
            printf("Server Accept Failed!\n");
            break;
        }

                /* receive data from client */
                while(1)
                {
                        bzero(buffer, BUFFER_SIZE);
                        length = recv(client_socket, buffer, BUFFER_SIZE, 0);
                        if (length < 0)
                        {
                                printf("Server Recieve Data Failed!\n");
                                break;
                        }

                        if('q' == buffer[0])
                        {
                                printf("Quit from client!\n");
                                break;
                        }

                        printf("%s\n", buffer);
                }

        close(client_socket);
    }

    close(server_socket);
    return 0;
}

windows端的代码:

#include <iostream>
#include <Windows.h>  

using namespace std;
#pragma comment(lib,"ws2_32.lib")  
#define  PORT 4000  
#define  IP_ADDRESS "166.111.138.13"  

int main(int argc, char* argv[])
{
    WSADATA  Ws;
    SOCKET ClientSocket;
    struct sockaddr_in ClientAddr;
    int Ret = 0;
    //char SendBuffer[MAX_PATH];
    char SendBuffer[MAX_PATH] = "abcd";
    char c[1];
    /* Init Windows Socket */
    if (WSAStartup(MAKEWORD(2, 2), &Ws) != 0)
    {
        printf("Init Windows Socket Failed::%d\n", GetLastError());
        return -1;
    }

    /* Create Socket */
    ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ClientSocket == INVALID_SOCKET)
    {
        printf("Create Socket Failed::%d\n", GetLastError());
        return -1;
    }

    ClientAddr.sin_family = AF_INET;
    ClientAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
    ClientAddr.sin_port = htons(PORT);
    memset(ClientAddr.sin_zero, 0x00, 8);

    /* connect socket */
    Ret = connect(ClientSocket, (struct sockaddr*)&ClientAddr, sizeof(ClientAddr));
    if (Ret == SOCKET_ERROR)
    {
        printf("Connect Error::%d\n", GetLastError());
        return -1;
    }
    else
    {
        printf("Connect succedded!\n");
    }

    while (1)
    {
        cin >> SendBuffer ;
        /* send data to server */
        Ret = send(ClientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
        if (Ret == SOCKET_ERROR)
        {
            printf("Send Info Error::%d\n", GetLastError());
            break;
        }

        if ('q' == SendBuffer[0])
        {
            break;
        }
    }

    /* close socket */
    closesocket(ClientSocket);
    WSACleanup();
    return 0;
}

附:ROS下使用的代码,将接收到的数据,以topic的形式发出去,注意运行的时候,要先运行roscore,再运行代码,我创建了一个ros包,创建过程看ros官网教程就好.

#include "ros/ros.h"
#include "std_msgs/String.h"

#include <iostream>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define HELLO_WORLD_SERVER_PORT    4000
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024

using namespace std;

int main(int argc, char **argv)
{
    ros::init(argc,argv,"server");
    ros::NodeHandle n;
    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("server",1000);
    //ros::Rate loop_rate(20);

    struct sockaddr_in server_addr;
        int server_socket;
        int opt = 1;

    bzero(&server_addr,sizeof(server_addr));

    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);
    server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);

        /* create a socket */
    server_socket = socket(PF_INET,SOCK_STREAM,0);
    if( server_socket < 0)
    {
        printf("Create  Failed!");
        exit(1);
    }

    /* bind socket to a specified address*/
    setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
    if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
    {
        printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
        exit(1);
    }

    /* listen a socket */
    if(listen(server_socket, LENGTH_OF_LISTEN_QUEUE))
    {
        printf("Server Listen Failed!");
        exit(1);
    }

    /* run server */
    //while (ros::ok())
    //{
    struct sockaddr_in client_addr;
    int client_socket;
    socklen_t length;
    char buffer[BUFFER_SIZE];

    /* accept socket from client */
    length = sizeof(client_addr);
    client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);
    if( client_socket < 0)
    {
        printf("Server Accept Failed!\n");
        //break;
    }
    /* receive data from client */
    while(ros::ok())
    {       
        std_msgs::String msg;
        bzero(buffer, BUFFER_SIZE);
        length = recv(client_socket, buffer, BUFFER_SIZE, 0);
        if (length < 0)
        {
            printf("Server Recieve Data Failed!\n");
            break;
        }
        if('q' == buffer[0])
        {
            printf("Quit from client!\n");
            break;
        }
        msg.data = buffer;
        printf("%s\n", buffer);
        chatter_pub.publish(msg);
    }
        //loop_rate.sleep();
        close(client_socket);
    //}
    close(server_socket);
    return 0;
}

声明:我的代码是拷贝的别人的,不是我自己写的,我只是稍加修改,如果有不满意,请联系我.

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值