首页 > 其他分享 >SOCKET(一):基本轮子详解与入门

SOCKET(一):基本轮子详解与入门

时间:2023-04-19 23:34:40浏览次数:46  
标签:SOCKET IP server 详解 Addr 轮子 include buf Socket

1.图解客户端与服务端交互流程

image

上图轮子详解

socket简单实践

服务端
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <fcntl.h>
#include <unistd.h>

unsigned short server_Port = 1234; // 服务器端口
const char *IP = "192.168.80.132"; // 服务器IP

/**字母转大写*/
void upper(char *buf)
{
    char *pointer = buf;
    while (*pointer != '\n')
    {
        if (*pointer >= 'a' && *pointer <= 'z')
            *pointer -= 32;
        pointer++;
    }
    return;
}

int main()
{
    //创建套接字
    int server_Socket = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in server_Addr;
    server_Addr.sin_family = AF_INET;
    server_Addr.sin_port = htons(server_Port);
    int flag = inet_aton(IP, &(server_Addr.sin_addr));
    if (!flag)
    {
        perror("IP transfer failed!\n");
    }

    //绑定服务器IP地址端口号
    bind(server_Socket, (struct sockaddr *)&server_Addr, sizeof(server_Addr));
    listen(server_Socket, 5);

    while (1)
    {

        printf("等待用户连接!\n");
        struct sockaddr_in client_Addr;
        int addrlen = sizeof(client_Addr);
        int conn_Socket = accept(server_Socket, (struct sockaddr *)&client_Addr, &addrlen);
        if (conn_Socket == -1)
        {
            perror("conn failed!\n");
        }

        //提取客户端信息
        char *client_Ip = inet_ntoa(client_Addr.sin_addr);
        unsigned short client_Port = ntohs(client_Addr.sin_port);
        printf("客户端: %s:%hu已连接!\n", client_Ip, client_Port);

        while (1)
        {

            char buf[100];
            memset(buf, '\0', 100);
            int count = read(conn_Socket, buf, 99);
            if (count == -1)
            {
                printf("客户端: %s:%hu连接故障!\n", client_Ip, client_Port);
            }
            else if (count == 0)
            {
                printf("客户端: %s:%hu断开连接!\n", client_Ip, client_Port);
                close(conn_Socket);
                break;
            }
            else
            {
                printf("客户端: %s:%hu消息:%s", client_Ip, client_Port, buf);
                upper(buf);
                write(conn_Socket, buf, 99);
            }
        }
    }
    
    return 0;
}
客户端
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <fcntl.h>
#include <unistd.h>

unsigned short server_Port = 1234; // 服务器端口
const char *IP = "192.168.80.132"; // 服务器IP
int main()
{
    // 创建套接字
    int client_Socket = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in server_Addr;
    server_Addr.sin_family = AF_INET;
    server_Addr.sin_port = htons(server_Port);
    int flag = inet_aton(IP, &(server_Addr.sin_addr));
    if (!flag)
    {
        perror("IP transfer failed!\n");
    }

    // 连接服务器
    flag = connect(client_Socket, (struct sockaddr *)&server_Addr, sizeof(server_Addr));
    if (flag == -1)
    {
        perror("conn failed!\n");
        return 0;
    }
    printf("成功连接服务端!\n");

    while (1)
    {
        // 终端输入
        printf("请输入消息:");
        char buf[100];
        fgets(buf, 99, stdin);

        // input end quit!
        if (strncmp(buf, "end", 3) == 0)
        {
            printf("用户退出!\n");
            close(client_Socket);
            break;
        }

        write(client_Socket, buf, 99);
        int count = read(client_Socket, buf, 99);

        if (count == -1)
        {
            printf("服务器连接故障!\n");
        }
        else if (count == 0)
        {
            printf("与服务器断开连接!\n");
            close(client_Socket);
            break;
        }
        else
        {
            printf("服务端返回消息:%s", buf);
        }
    }
    return 0;
}

套接字赋值

当我们对套接字进行赋值时,需要将IP地址以及端口号转换为网络字节序。port类型为 unsigned short;对于IP字符的转换有多个接口,可自行查阅。

read判定退出状态

无论当我们关闭哪一方套接字时,都会向另一方发送一个EOF(表明数据发送完毕),所以读取到的字符数为0。

总结

本节仅对socket最基本的轮子进行了使用的介绍,让入门的同学知道客户端与服务端的建立连接并进行通信的流程,下一节我们将深入了解这些轮子。

标签:SOCKET,IP,server,详解,Addr,轮子,include,buf,Socket
From: https://www.cnblogs.com/loserli/p/17335080.html

相关文章

  • 基于UDP协议的Socket通信
    TCP和UDP最大的区别在于是否需要客户端与服务端建立连接后才能进行数据传输,如果你学习前面的TCP,传输前先开服务端,accept,等客户端接入,然后获得客户端socket然后进行IO操作,而UDP则不用,UDP以数据报作为数据的传输载体,在进行传输时首先要把传输的数据定义成数据报(Datagram),在数据报中......
  • 延迟绑定与 ret2dlresolve 详解
    ret2dlresolve是栈溢出下的一种攻击方法,主要用于程序没有办法利用puts、printf、writer函数等泄露程序内存信息的情况。延迟绑定在Linux中,为了程序运行的效率与性能,在没有开启FULLRELRO时候,程序在第一次执行函数时,会先执行一次动态链接,将对应函数的got表填上libc......
  • #yyds干货盘点#详解Django基础
    一:创建项目使用django-admin命令构建项目django-adminstartprojectHelloWorld如上使用django构建了一个HelloWorld项目二:项目结构我们可以看到HelloWorld项目结构如下|--HelloWorld||--__init__.py||--settings.py||--urls.py|`--wsgi.py`--manage.p......
  • sshd配置文件详解
    转自:http://blog.licess.com/sshd_config/#1.关于SSHServer的整体设定,包含使用的port啦,以及使用的密码演算方式Port22#SSH预设使用22这个port,您也可以使用多的port!#亦即重复使用port这个设定项目即可!Protocol......
  • 【中介者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介中介者模式(MediatorPattern)是一种行为型模式。它限制对象之间的直接交互,它用一个中介对象来封装一系列的动作,以让对象之间进行交流。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。当一些对象和其他对象紧密耦合以致难以对其进......
  • 详解argparse 模块
    在Python中,可以使用argparse模块来控制代码的参数。argparse可以读取命令行输入的参数,并根据定义的规则进行解析和处理。控制变量取值以下是一个简单的例子,说明如何在Python中使用argparse:importargparseparser=argparse.ArgumentParser(description='PyTorch......
  • Linux最常见的三个应用领域详解!
    Linux应用领域有很多,其中最为主要的就是这三种:IT服务器Linux系统应用领域、嵌入式Linux系统应用领域和个人桌面linux应用领域,接下来我们来看看具体的内容介绍。与Windows操作系统软件一样,Linux也是一个操作系统软件。但与Windows不同的是,Linux是一套开放源代码程序的,并可以......
  • 基于UDS的DoIp实现(六) -- 通信协议实现:Socket 通信
    ISO14229、UDS诊断服务文档,都说明UDS是基于Can通信实现,其接收的数据格式,也是Can数据格式。但是,一方面是在本地模拟Can通信比较麻烦,另一方面,也是想单独的将UDS抽出来,不依赖于通信协议,仅仅作为一个单独的功能进行实现,所以,这里才使用比较简单的Socket通信进行数据收发。一、Sock......
  • sql server的cube操作符使用详解[转]
    sqlserver的cube操作符使用详解cube操作符  要使用cube,首先要了解groupby  其实cube和rollup区别不太大,只是在基于groupby子句创建和汇总分组的可能的组合上有一定差别,  cube将返回的更多的可能组合。如果在groupby子句中有n个列或者是有n个表达式的话,  sqlserv......
  • 使用约束详解[转]
    使用约束1.使用primarykey约束 其值能唯一的标识表中的每一行。这样的一列或多列成为表的主键,通过它可强制表的实体完整性。 job_idintprimarykeyclustered emp_idempidconstraintpk_emp_idprimarykeynonclustered2.使用foreign......