小练习:用socket实现Linux和Windows之间的通信

在日常生活中,绝大部分人使用的机器一般是windows系统,但是对于研发人员,开发、编译等工作往往是建立在linux机器上。事实上,在服务器方面,Linux、UNIX和WindowsServer占据了市场的大部分份额;在超级计算机方面,Linux取代Unix成为了第一大操作系统。

通信是计算机和操作系统的一大任务,通过ftp、ping、ssh等方式,人们可以很方便与服务器连接。一个庞大的网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。windows系统使用的是windows socket,而linux使用的posix socket。今天结合了网上一些经典例程,写了一个简单的socket代码,实现Ubuntu(虚拟机中)和Windows的通信。

Windows平台下客户端的实现代码:

#include <stdio.h>
#include <Windows.h>

#pragma comment(lib, "ws2_32.lib")
#define Port 5000
#define IP_ADDRESS "172.30.70.95"

int main(int argc, char* argv[]) // argc是命令行总的参数个数
{

        WSADATA s; // 用来储存调用AfxSocketInit全局函数返回的Windows Sockets初始化信息
        SOCKET ClientSocket;
        struct sockaddr_in ClientAddr; // 一个sockaddr_in型的结构体对象
        int ret = 0;
        char SendBuffer[MAX_PATH];   // Windows的MAX_PATH默认是260

        // 初始化Windows Socket
        // WSAStartup函数对Winsock服务的初始化
        if (WSAStartup(MAKEWORD(2, 2), &s) != 0) // 通过连接两个给定的无符号参数,首个参数为低字节
        {
            printf("Init Windows Socket Failed! Error: %d\n", GetLastError());
            getchar();
            return -1;
        }

        while (1)
        {
        // 创建一个套接口
        // 如果这样一个套接口用connect()与一个指定端口连接
        // 则可用send()和recv()与该端口进行数据报的发送与接收
        // 当会话结束后,调用closesocket()
        ClientSocket = socket(AF_INET, // 只支持ARPA Internet地址格式
            SOCK_STREAM, // 新套接口的类型描述
            IPPROTO_TCP); // 套接口所用的协议
        if (ClientSocket == INVALID_SOCKET)
        {
            printf("Create Socket Failed! Error: %d\n", GetLastError());
            getchar();
            return -1;
        }

        ClientAddr.sin_family = AF_INET;
        ClientAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS); // 定义IP地址
        ClientAddr.sin_port = htons(Port); // 将主机的无符号短整形数转换成网络字节顺序
        memset(ClientAddr.sin_zero, 0X00, 8); // 函数通常为新申请的内存做初始化工作

        // 连接Socket
        ret = connect(ClientSocket,
            (struct sockaddr*)&ClientAddr,
            sizeof(ClientAddr));
        if (ret == SOCKET_ERROR)
        {
            printf("Socket Connect Failed! Error:%d\n", GetLastError());
            getchar();
            return -1;
        }
        else
        {
            printf("Socket Connect Succeed!");
        }

        printf("Input Data: ");
        while (1)
        {
            scanf("%s", &SendBuffer);

            // 发送数据至服务器
            ret = send(ClientSocket,
                SendBuffer,
                (int)strlen(SendBuffer), // 返回发送缓冲区数据长度
                0);

            if (ret == SOCKET_ERROR)
            {
                printf("Send Information Failed! Error:%d\n", GetLastError());
                getchar();
                break;
            }

            break;
        }

        // 关闭socket
        closesocket(ClientSocket);
        if (SendBuffer[0] == ‘q‘) // 设定输入第一个字符为q时退出
        {
            printf("Quit!\n");
            break;
        }

    }
        WSACleanup();
                    getchar();
        return 0;
}

我的linux(Ubuntu)端网络信息:

linux(Ubuntu)平台下的服务器代码:

#include <unistd.h>
#include <stdio.h>
#include <i386-linux-gnu/sys/socket.h>
#include <netinet/in.h>
#include <i386-linux-gnu/sys/types.h>
#include <stdlib.h>
#include <string.h>

#define SERVER_PORT 5000
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 10

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

    bzero(&server_addr, sizeof(server_addr)); // 置字节字符串前n个字节为0,包括‘\0‘
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htons(INADDR_ANY); // 转小端,INADDR_ANY就是指定地址为0.0.0.0的地址
    server_addr.sin_port = htons(SERVER_PORT);  

    // 创建一个Socket
    server_socket = socket(PF_INET, SOCK_STREAM, 0);

    if (server_socket < 0)
    {
        printf("Create Socket Failed!\n");
        exit(1);
    }

    // bind a socket
    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!\n", SERVER_PORT);
        exit(1);
    }

    // 监听Socket
    if (listen(server_socket, LENGTH_OF_LISTEN_QUEUE))
    {
        printf("Server Listen Failed!\n");
        exit(1);
    }      

    while(1)
    {

        struct sockaddr_in client_addr;
        int client_socket;
        socklen_t length;
        char Buffer[BUFFER_SIZE];

        // 连接客户端Socket
        length = sizeof(client_addr);
        client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);
        if (client_socket < 0)
        {
            printf("Server Accept Failed!\n");
            break;
        }

        // 从客户端接收数据
        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!\n");
                break;
            }

            printf("%s\n", Buffer);
            break;

        }

        close(client_socket);
    }

    close(server_socket);
    return 0;
}

在打开客户端时,服务器端要确保已处于监听状态,否则连接失败:

打开服务器端程序如下:

数据传输成功:

这个小实验只花了很少的时间调试,且只能单向发送数据,功能单一,纯粹只是一个小练习,socket编程的调试中,主要关注程序出错时返回的错误值,从中往往能很快找出代码的漏洞。

参考链接:http://blog.csdn.net/feixiaoxing/article/details/8567162

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-03 07:13:35

小练习:用socket实现Linux和Windows之间的通信的相关文章

samba服务:Linux与windows之间的数据共享

samba服务:Linux与windows之间的数据共享 ----tlinux 安装samba服务 0x01 服务介绍 Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,而SMB是Server Message Block的缩写,即为服务器消息块 ,SMB主要是作为Microsoft的网络通讯协议,后来Samba将SMB通信协议应用到了Linux系统上,就形成了现在的Samba软件.后来微软又把 SMB 改名为 CIFS(Common Internet File Syst

securecrt在linux与windows之间传输文件(转)

摘自:http://blog.csdn.net/rangf/article/details/6096365 SecureCRT这款SSH客户端软件同时具备了终端仿真器和文件传输功能.比ftp命令方便多了,而且服务器不用再开FTP服务了.rz,sz是便是Linux/Unix同Windows进行ZModem文件传输的命令行工具. windows端需要支持ZModem的telnet/ssh客户端,SecureCRT就可以用SecureCRT登陆到Unix/Linux主机(telnet或ssh均可).

linux与linux,linux与windows之间用SSH传输文件

linux与linux,linux与windows之间用SSH传输文件linux与linux之间传送文件:scp file [email protected]:文件地址    例: scp abc.txt [email protected]:/home/endall/abc.txt windows与linux之间传送文件:笔者用putty的内置PSCP.其它如 SSH Secure File Transfer Client 先在WIN的DOS下,PUTTY目录下及PSCP文件所在目录. pscp

linux与linux、windows之间文件共享的几种方式

在平时的开发过程中经常都会涉及到linux和linux之间.linux和windows之间的文件传输或者共享的情况(最好关闭防火墙),现根据平时使用的情况总结如下:一.linux和windows文件共享1. 当linux为虚拟机时比如安装在VMware下,可以直接利用其虚拟工具VMware Tools设置一个windows和linux之间的共享目录(具体方法根据不同的linux参照网上资料),因为该共享目录和linux系统不在同一分区,用来编译系统相关源码时最好别放在该分区.2. 配置samba

虚拟机中实现Linux与Windows之间的文件传输

虚拟机中实现Linux与Windows之间的文件传输 标签: linux 2016年06月28日 11:17:37 2092人阅读 评论(0) 收藏 举报  分类: linux(2)  一.配置环境 虚拟机Linux:Fedora 9 文件传输工具:SSHSecureShellClient-3.2.9 二.实现步骤 1. 在Windows中安装文件传输工具SSHSecureShellClient-3.2.9,主界面如下: 左边是Windows资源管理器,右边是Linux目录显示区(还没连接到Li

【转】G40-70、G50-70联想小新笔记本SR1000随机Linux改Windows 7系统操作指导

http://support1.lenovo.com.cn/lenovo/wsi/htmls/detail_20140505150749705.html 适用范围:G40-70,G50-70联想小新笔记本SR1000,Linux改win7知识点分析:此为Windows 8改Windows 7,但是由于经常使用Ghost和PE,所以需要先将GPT更改为MBR,否则可能导致无法识别到硬盘.操作步骤: 注意:由于电脑出厂采用的硬盘是GPT的分区格式,所以如果使用Ghost和PE,是无法识别到硬盘的,此

Linux操作系统 进程之间的通信

进程之间的通信 预备知识: 1.用户态和内核态,当一个进程在执行用户自己的代码时处于用户运行态(用户态):当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态). 2.进程之间的通信(Inter Processs Communication-IPC)实现机制有:管道.消息队列.信号值.信号.共享内存.共享映射文件.套接字等. 3.及时通信:信号(类似中断):非及时通信:共享内存.邮箱.管道.套接字. 4.常见的信号:终止信号.定时器信号.用户自定义信号等 5.信号:用户.系统或者进程

虚拟机centOs Linux与Windows之间的文件传输

一.配置环境 虚拟机Linux:Fedora 9 文件传输工具:SSHSecureShellClient-3.2.9 二.实现步骤 1. 在Windows中安装文件传输工具SSHSecureShellClient-3.2.9,主界面如下: 左边是Windows资源管理器,右边是Linux目录显示区(还没连接到Linux不可操作) 2. 启动虚拟机中的Linux,查看Linux的IP地址,如下: ifconfig命令查看IP地址,我的IP是192.168.134.128 3. 在Windows的命

在Ubuntu16.04 64位下搭建samba,实现linux与windows之间的资源共享

Samba是SMB的一种实现方法,主要用来实现Linux系统的文件和打印服务.Linux用户通过配置使用Samba服务器可以实现与Windows用户的资源共享. 1.开始需要我们做的是先在我们的ubuntu下安装好samba: 安装samba:sudo apt-get install samba 安装smbclient:sudo apt-get install smbclient 2.修改配置文件 vi /etc/samba/smb.conf 编辑smb.conf 文件 在配置文件的最末尾加上