如何在Linux下实现Socket编程?

在 Linux 中,可以使用 Berkeley sockets API 来实现网络通信

在Linux系统中实现Socket编程,主要涉及到套接字(Socket)的创建、绑定、监听、连接、数据传输和关闭等步骤,以下是对Socket linux实现的详细介绍:

如何在Linux下实现Socket编程?

Socket概念

Socket是应用层与传输层之间的接口,通过它可以在网络上进行进程间通信,在Linux中,Socket是通过文件描述符来表示的,可以像文件一样进行读写操作。

Socket通信模型

Socket通信通常基于客户端-服务器模型,包括TCP和UDP两种主要的通信协议。

1、TCP(Transmission Control Protocol):面向连接的可靠通信协议,通过三次握手建立连接,确保通信双方准备好进行数据交换,并在传输结束后执行四次挥手断开连接,保证资源的正确释放。

2、UDP(User Datagram Protocol):无连接的通信协议,速度快但不可靠,不提供复杂的错误检测和纠正机制。

Socket编程步骤

1、创建Socket:使用socket()系统调用创建一个Socket。

2、绑定Socket:使用bind()将Socket绑定到一个地址和端口。

3、监听连接(仅适用于TCP):使用listen()开始监听连接请求。

4、接受连接(仅适用于TCP):使用accept()接受客户端的连接请求。

如何在Linux下实现Socket编程?

5、建立连接:客户端使用connect()连接到服务器端。

6、发送和接收数据:使用send()recv()发送和接收数据。

7、关闭连接:使用close()关闭连接。

Socket编程接口

在Linux中,Socket编程主要使用C语言的Socket编程接口,包括socket()bind()listen()accept()connect()send()recv()等函数。

Socket文件描述符

在Linux中,Socket被视为一种文件描述符,可以像文件一样进行读写操作。

Socket编程实例

以下是一个简单的基于TCP的Socket通信的客户端-服务器模型的Socket通信示例:

服务器端代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#define MAXLINE 80
#define SERV_PORT 8000
int main(void) {
    struct sockaddr_in servaddr, cliaddr;
    socklen_t cliaddr_len;
    int listenfd, connfd;
    char buf[MAXLINE];
    char str[INET_ADDRSTRLEN];
    int i, n;
    // socket() 打开一个网络通讯端口,如果成功的话,就像 open() 一样返回一个文件描述符
    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(SERV_PORT);
    // bind() 的作用是将参数 listenfd 和 servaddr 绑定在一起,使 listenfd 这个用于网络通讯的文件描述符监听 servaddr 所描述的地址和端口号
    bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    // listen() 声明 listenfd 处于监听状态,最多允许有 20 个客户端处于连接待状态,如果接收到更多的连接请求就忽略
    listen(listenfd, 20);
    printf("Accepting connections ...
");
    while (1) {
        cliaddr_len = sizeof(cliaddr);
        // accept() 返回并接受这个连接,尚未 accept 的客户端就处于连接等待状态
        connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);
       n = read(connfd, buf, MAXLINE);
       printf("received from %s at PORT %d
", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port));
       for (i = 0; i < n; i++) {
           buf[i] = toupper(buf[i]);
       }
       write(connfd, buf, n);
       close(connfd);
    }
}

客户端代码示例:

如何在Linux下实现Socket编程?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAXLINE 80
#define SERVADDR "127.0.0.1"
#define SERVPORT 8000
int main(void) {
    struct sockaddr_in servaddr;
    int sockfd;
    char sendline[MAXLINE], recvline[MAXLINE];
    socklen_t len;
    // socket() 创建一个套接字,类型为流式套接字,协议为默认的 TCP 协议
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SERVPORT);
    inet_pton(AF_INET, SERVADDR, &servaddr.sin_addr);
    // connect() 主动与服务器建立连接
    connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    while (fgets(sendline, MAXLINE, stdin) != NULL) {
        write(sockfd, sendline, strlen(sendline)); //write() 向套接字写入数据,即发送数据给服务器
        bzero(recvline, MAXLINE);
        read(sockfd, recvline, MAXLINE); //read() 从套接字读取数据,即接收来自服务器的数据
        fputs(recvline, stdout);
    }
    close(sockfd); //close() 关闭套接字,释放资源
}

编译和运行

1、编译服务器端代码:gcc server.c -o server

2、编译客户端代码:gcc client.c -o client

3、启动服务器:./server

4、启动客户端:./client

示例展示了一个简单的基于TCP的Socket通信的客户端-服务器模型,通过这些代码,你可以理解如何在Linux系统上使用Socket编程实现网络通信,在实际应用中,你可以根据需求扩展和修改这些代码来满足特定的通信需求。

原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1257615.html

本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。

(0)
未希的头像未希新媒体运营
上一篇 2024-11-01 09:38
下一篇 2024-11-01 09:49

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

产品购买 QQ咨询 微信咨询 SEO优化
分享本页
返回顶部
云产品限时秒杀。精选云产品高防服务器,20M大带宽限量抢购 >>点击进入