Linux最简单的网络通信

服务器端

/* socket server
 * 2014-12-15 CopyRight (c) arbboter
 */
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <arpa/inet.h>
int main()
{
    int sockfd_server;
    int sockfd_client;
    struct sockaddr_in addr_server;
    struct sockaddr_in addr_client;
    socklen_t addr_len = 0;
    int client_max = 10;
    int server_port = 33892;

    srand(time(NULL));

    // create socket
    sockfd_server = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd_server == -1)
    {
        printf("init socket failed\n");
        return -1;
    }

    // set address
    memset(&addr_server, 0, sizeof(addr_server));
    addr_server.sin_family = AF_INET;
    addr_server.sin_addr.s_addr = htonl(INADDR_ANY);
    addr_server.sin_port = htons(server_port);

    // socket bind with address
    if(bind(sockfd_server, (struct sockaddr*)&addr_server, sizeof(struct sockaddr)) == -1)
    {
        printf("bind socket failed\n");
        return -1;
    }

    // server socket start list, waitting client to connect
    // 这个client_max是指同时连接数
    if(listen(sockfd_server, client_max) == -1)
    {
        printf("start listen socket failed\n");
        return -1;
    }

    char szMsg[128] = {0};
    while(1)
    {
        addr_len = sizeof(struct sockaddr_in);
        printf("waitting for connected...\n");

        // waitting for connected
        sockfd_client = accept(sockfd_server, (struct sockaddr*)&addr_client, &addr_len);
        if(sockfd_client == -1)
        {
            printf("accept socket failed\n");
            return -1;
        }

        // get client ip and send a magic number to the client,
        // then close this connection
        printf("recived connection from : %s\n", inet_ntoa(addr_client.sin_addr));
        sprintf(szMsg, "Your magic number is : %d", rand()%100);
        write(sockfd_client, szMsg, strlen(szMsg));

        close(sockfd_client);
    }
    close(sockfd_server);
    return 0;
}

客户端

/* socket client
 * 2014-12-15 CopyRight (c) arbboter
 */
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <arpa/inet.h>
int main()
{
    int sockfd_server;
    struct sockaddr_in addr_server;
    socklen_t addr_len = 0;
    int server_port = 33891;
    char* server_addr = "192.168.2.200";

    // create socket
    sockfd_server = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd_server == -1)
    {
        printf("init socket failed\n");
        return -1;
    }

    // set server address
    memset(&addr_server, 0, sizeof(addr_server));
    addr_server.sin_family = AF_INET;
    addr_server.sin_addr.s_addr = inet_addr(server_addr);;
    addr_server.sin_port = htons(server_port);

    // connect server
    if(connect(sockfd_server,(struct sockaddr *)&addr_server,sizeof(struct sockaddr))==-1)
    {
        printf("connect server failed\n");
        return -1;
    }

    char szBuf[512] = {0};
    int nRead = 0;

    // recived data from server and print it
    nRead = read(sockfd_server, szBuf, sizeof(szBuf));
    printf("recived from server : %s\n", szBuf);    

    close(sockfd_server);
    return 0;
}

运行结果

# server output
[[email protected]]$ g++ server.cpp -o server
[[email protected]]$ ./server
waitting for connected...
recived connection from : 192.168.2.200
waitting for connected...
recived connection from : 192.168.2.200
waitting for connected...
recived connection from : 192.168.2.200
waitting for connected...
recived connection from : 192.168.2.200
waitting for connected...

# client output
[[email protected]]$ g++ client.cpp -o client
[[email protected]]$ ./client
recived from server : Your magic number is : 5
[[email protected]]$ ./client
recived from server : Your magic number is : 43
[[email protected]]$ ./client
recived from server : Your magic number is : 88
[[email protected]]$ ./client
recived from server : Your magic number is : 28
[[email protected]]$ 

时间: 2024-10-05 11:20:44

Linux最简单的网络通信的相关文章

Linux程序设计学习笔记----网络通信编程API及其示例应用

转载请注明出处, http://blog.csdn.net/suool/article/details/38702855. BSD Socket 网络通信编程 BSD TCP 通信编程流程 图为面向连接的Socket通信的双方执行函数流程.使用TCP协议的通信双方实现数据通信的基本流程如下 建立连接的步骤 1.首先服务器端需要以下工作: (1)调用socket()函数,建立Socket对象,指定通信协议. (2)调用bind()函数,将创建的Socket对象与当前主机的某一个IP地址和TCP端口

Linux shell ${}简单用法

转自:Linux shell ${}简单用法 为了完整起见,我这里再用一些例子加以说明 ${ } 的一些特异功能:假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt我们可以用 ${ } 分别替换获得不同的值:${file#*/}:拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt${file##*/}:拿掉最后一条 / 及其左边的字符串:my.file.txt${file#*.}:拿掉第一个 . 及其左边的字符串:fil

就linux三剑客简单归纳

就linux三剑客简单归纳: 1:awk 习题1:用 awk 中查看服务器连接状态并汇总 netstat -an|awk '/^tcp/{++s[$NF]}END{for(a in s)print a,s[a]}' ESTABLISHED 1 LISTEN 20 习题2:统计 web 日志访问流量,要求输出访问次数,请求页面或图片,每个请求的总大小, 总访问流量的大小汇总 awk '{a[$7]+=$10;++b[$7];total+=$10}END{for(x in a)print b[x],

Linux下简单的socket通信实例

Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Bruce Lee       学习网络编程也一段时间了,刚开始看<UNIX网络编程>的时候,觉得这本厚厚的书好难啊!看到后来,发现并没有想象中的那么难.如果你是新手,建议你看到第二部分结束后,开始着手写代码.不写代码肯定是不行的.看100遍也没有敲一遍实现一遍来的清楚.敲完以后,带着问题去看书,你会

linux下简单抓包分析

有时候会遇到一些问题需要我们来抓包分析,当手头又没有专业的抓包工具的时候,可以用tcpdump来替代一下(一般的发行版都自带这个工具) 比如我们要分析一下eth0接口下跟192.168.7.188 这个目的IP地址22端口的发包情况 tcpdump -i eth0 dst 192.168.7.188 and port 22 tcpdump -i eth0 dst 192.168.7.188 and port 22 tcpdump: verbose output suppressed, use -

Thinkbox.Deadline.v8.0.4.1.Linux 1DVD简单易用的管理和渲染+Xpedition Enterprise VX.2.1

Allen Bradley RSLogix5 v8.0 Win32-ISO 1DVD 使用RSLogix 5000 软件可以完全实现对模块的设置和监视 通过I/O 实现ControlLogix 背板连接 所有模块相关数据都包含在一个处理器数据对象中,这便于配置,监视和连接模块参数.RSLogix 5000功能更加强大,更加方便实用.RsLogix 5000编程软件除了为顺序控制提供梯形图编程外,还可以为运动控制提供完整的编程及调试支持.RSLogix 5000可同时完成顺序控制与运动控制. Sy

Linux下简单基本操作【备查】

Linux下简单基本操作[备查]①解压文件指令 tar zxvf filename (filename文件名)②查看修改文件内容 vi filename i 进入修改模式 修改后保存步骤 esc——shift+: ——wq(保存退出 q直接退出)③文件删除命令rm 命令格式:rm [fir] 文件或目录 参数说明: -f:强制删除 -i:交互模式,在删除前询问用户是否操作 -r:递归删除,常用在目录的删除 如删除/test目录下的file1文件,可以输入以下命令: rm -i /test/fil

Linux下简单的取点阵字模程序

源:Linux下简单的取点阵字模程序 Linux操作系统下进行简单的图形开发,经常会用到取字模的软件,但是Linux并没有像Windows下的小工具可用,我们也并不希望为了取字模而频繁地切换操作系统.(由于是完全由C语言编写,所以不需要任何修改,这个字库同样可以用在嵌入式环境的Windows操作系统下面) 本人结合网上的资料,对这个问题进行了总结,整理了代码,供有需要的朋友使用我参考.转载请注明出处:http://blog.csdn.net/weiwang876253631/article/de

从零单排Linux – 1 – 简单命令

从零单排Linux – 1 – 简单命令 Posted in: Linux 从零单排Linux – 1 一.Linux的简单命令: 1.忘记root密码: 读秒时按任意键进入 – e – ↓选择第二个 – e – 1 – b – 命令:passwd 回车 – 输入新密码 – reboot 2.修改用户密码: 打开终端 – passwd tanzhou – 新密码 3.修改root密码: 打开终端 – passwd – 新密码 4.切换用户:su 用户名 5.切换到root用户:su – 6.关机