首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux使用socket

Linux 使用 Socket 的基础概念

Socket(套接字)是一种网络通信机制,允许不同计算机上的进程通过网络进行数据交换。在 Linux 系统中,Socket 是实现网络编程的基础。

基础概念

  1. IP 地址:标识网络中的设备。
  2. 端口号:标识设备上的特定进程。
  3. 协议:如 TCP(传输控制协议)和 UDP(用户数据报协议),定义数据传输的方式。

相关优势

  1. 跨平台性:Socket 编程可以在不同的操作系统上运行。
  2. 灵活性:支持多种网络协议和通信模式。
  3. 高效性:能够处理大量并发连接。

类型

  1. 流式套接字(SOCK_STREAM):基于 TCP 协议,提供可靠的、面向连接的数据传输。
  2. 数据报套接字(SOCK_DGRAM):基于 UDP 协议,提供无连接的数据传输,速度较快但不保证数据完整性。
  3. 原始套接字(SOCK_RAW):允许直接访问网络层协议,如 IP 和 ICMP。

应用场景

  • Web 服务器和客户端:HTTP、HTTPS 协议。
  • 即时通讯应用:如聊天软件、在线游戏。
  • 文件传输服务:FTP 协议。
  • 远程登录服务:SSH 协议。

示例代码

TCP 客户端示例

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

int main() {
    int sockfd;
    struct sockaddr_in server_addr;

    // 创建 socket
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    // 设置服务器地址
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);
    inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);

    // 连接服务器
    if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        perror("connect");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    // 发送数据
    char *message = "Hello, Server!";
    send(sockfd, message, strlen(message), 0);

    // 接收数据
    char buffer[1024];
    int bytes_received = recv(sockfd, buffer, sizeof(buffer) - 1, 0);
    buffer[bytes_received] = '\0';
    printf("Received: %s\n", buffer);

    // 关闭 socket
    close(sockfd);
    return 0;
}

TCP 服务器示例

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);

    // 创建 socket
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // 绑定 socket
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 监听连接
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 接受连接
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 接收数据
    char buffer[1024] = {0};
    int bytes_received = recv(new_socket, buffer, sizeof(buffer), 0);
    printf("Received: %s\n", buffer);

    // 发送数据
    char *response = "Hello, Client!";
    send(new_socket, response, strlen(response), 0);

    // 关闭 socket
    close(new_socket);
    close(server_fd);
    return 0;
}

常见问题及解决方法

1. 连接超时

原因:可能是网络延迟或服务器未响应。 解决方法:增加超时设置,检查服务器状态。

代码语言:txt
复制
struct timeval timeout;
timeout.tv_sec = 5;  // 5秒超时
timeout.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));

2. 数据丢失

原因:网络不稳定或程序逻辑错误。 解决方法:使用可靠的传输协议(如 TCP),增加数据校验机制。

3. 端口冲突

原因:多个程序尝试绑定同一端口。 解决方法:检查正在运行的程序,更改端口号。

代码语言:txt
复制
server_addr.sin_port = htons(8081);  // 更改端口号

通过以上示例和解决方案,您可以更好地理解和应用 Linux 中的 Socket 编程。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Linux】: Socket 编程

网络协议中的下三层,主要解决的是,数据安全可靠的送到远端机器 用户使用应用层软件,完成数据发送和接收的 先把这个软件启动起来-->进程 日常网络通信的本质:就是进程间通信!!...* 类型表示,在使用的时候需要强制转化成sockaddr_in,这样的好处是程序的通用性,可以接收IPv4, IPv6, 以及UNIX Domain Socket各种类型的 ​​​​​​​sockaddr...7.4 接收连接请求 (TCP 服务器) 服务器使用 accept() 从连接队列中提取下一个连接请求,并返回新的套接字用于与客户端通信: int accept(int socket, struct sockaddr...local.sin_addr.s_addr = INADDR_ANY; Listening Socket vs Connected Socket Listening Socket:服务器使用它来监听连接请求...客户端连接:客户端通过 socket() 创建套接字,使用 connect() 发起连接请求。 三次握手:TCP 客户端与服务器通过三次握手建立连接。

14010
  • Linux下Socket编程(四)——epoll的使用简介

    内存拷贝, select让内核把 FD 消息通知给用户空间的时候使用了内存拷贝的方式,开销较大,但是Epoll 在这点上使用了共享内存的方式,这个内存拷贝也省略了。...需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致...EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里 epoll_wait int epoll_wait...Linux内核具体的epoll机制实现思路。...当某一进程调用epoll_create方法时,Linux内核会创建一个eventpoll结构体,这个结构体中有两个成员与epoll的使用方式密切相关 /* * This structure is stored

    2.3K30

    【Linux】Socket编程—TCP

    TCP socket API 详解   下面介绍程序中用到的 socket API,这些函数都在 sys/socket.h 中。...socket() 作用:打开一个网络通讯端口,如果成功的话,就像 open()一样返回一个文件描述符; 应用程序可以像读写文件一样用 read/write 在网络上收发数据; 返回值:如果 socket...listensockfd; bool _isruning; }; 与Udp服务器不同的是,Tcp服务要求我们先调用listen接口监听,然后在通过accept和客户端使用...connet建立连接后才可以进行通信;所以如果仅仅使用单进程是无法满足同时接收多个客户端的消息,下面将会给出多进程、多线程以及基于线程池实现的Tcp服务。...使用服务器代码如下: #include "TcpServer.hpp" int main() { std::unique_ptr tcpserver = std::

    8810

    linux下socket编程

    Socket soket接口是TCP/IP网络的API。网络的socket数据传输是一种特别的I/O,socket也是一种文档描述符。...prococol)来创建socket     domain:指明所使用的协议族,常用PF_INET, 表示互联网协议族(TCP/IP) 说明: 在绑定本地地址或连接远程地址时需要初始化sockaddr_in...结构,其中指定address family时一般设置为AF_INET,即使用IP。...中用PF_INET指定协议族,在设置address中时,使用AF_NET,当然两者是一样的。  ...位值从网络字节序转换为主机字节序 ntohs(); 把16位值从网络字节序转换为主机字节序     bind函数在成功调用后,返回0,出错返回-1并将errno设置为响应的错误号 建立连接     面向连接的客户程式使用

    4K70

    Linux Socket 收发Json

    如果对你有帮助,麻烦点个在看或点个赞,感谢~ 不管是Qt开发还是linux 嵌入式应用开发,一个人的核心竞争力还是不断思考,也就是不断琢磨。...下面的程序主要是Linux C Socket 读取JSON文件并传输,然后再写入文件,其中使用了cJSON库,关于cJSON库不过多介绍,主要介绍整体的思路。 1....Server 端 使用的是socket 阻塞式,没有使用select、poll、epoll等 接收端按照JSON格式解析数据,并提取感兴趣Key所对应的Value 程序功能挺快就可以做好,做完之后进行拆解...,将socket通信独立出来,JSON解析、写文件、响应客户端JSON数据等分别写成函数。...小结 编译JSON时需要链接linux的数学库 自己琢磨如何拆解函数功能 应用程序也主要是调用别人的api,那么你的核心竞争力是什么呢 ? 如需程序工程可在公众号后台留言。

    4.7K20

    Linux系统下socket编程socket接口介绍(二)

    前言 在上一篇文章里面我们介绍了TCP的三次握手和四次挥手过程的介绍以及网络编程里面的一些api接口函数的介绍——Linux系统下socket编程之socket接口介绍(一)。...函数介绍 - 发送和接收 - (1)send和write: 首先说明的一点,之前介绍的socket这个函数,非常类似我们之前介绍的open函数,他们都会返回一下文件描述符;所以这里的send函数和write...IP地址格式转换函数 - (1)inet_aton、inet_addr、inet_ntoa(只用IPV4的IP地址),现在用的比较少,不过大多程序里面会看到这些函数,所以还是要学习一下它的作用,老方法使用...(这个转换完后不能用于网络传输,还需要调用htons或htonl函数才能将主机字节顺序转化为网络字节顺序,这两个函数先不讲,实战遇到的话,再进行解析),具体可以看下面Linux的源文: inet_aton...(2)struct sockaddr,这个结构体是linux的网络编程接口中用来表示IP地址的 标准结构体,bind、connect等函数中都需要这个结构体,这个结构体是兼容IPV4和IPV6的。

    3.8K20

    linux udp编程_linux中socket编程

    在前面的文件中,我们介绍了linux网络编程中与IP相关的知识和常用的函数总结,本文针对具体的UDP通信,来详细的介绍UDP通信的使用,包括UDP通信中的点对点通信,多播,广播等。...当然,在我们服务端创建socket后,主动往外发送一个数据,这样即使我们不进行绑定,我们依然可以收到数据,这只是系统通过我们的发送,自动的绑定了一个端口,这个并不是我们想要的,实际的使用中,也并不推荐这种方式...: 3.3 使用组播的服务端和客户端例子 (TBD) 三、UDP中广播的使用 UDP广播与普通的UDP通信区别不是很大,如果需要发送广播消息时,只需要在创建完socket后,配置一下套接字,允许进行发送广播消息...解决方法如下:(允许端口重用) int on = 1; ret = setsockopt(udp_net_sta.socket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof...(int)); if (ret < 0) { perror("socket set SO_REUSEADDR failed"); } 2、服务端程序,在创建完socket后,有一个bind的操作

    11.1K10

    Linux C Socket Api详解

    套接字描述符 首先会先到的是文件描述符,对Linux一切皆文件的哲学又多懂了一点儿点儿。 套接字是通信端点的抽象。与应用程序使用文件描述符一样,访问套接字需要使用套接字描述符。...TCP/IP协议栈使用大端字节序。有关字节序大家可自行百度。 Linux系统是小端字节序。 2.2 地址格式 地址确定了特定通信域中的套接字端点,地址格式与特定的通信域相关。...我目前使用的ubuntu定义如下: /* Structure describing an Internet socket address. */ struct sockaddr_in {...注意:linux的man命令可以查看api的详细说明,而且还有例子,也挺不错的。 4....Linux Socket Server 与 Client 例子 个人觉得这只是套接字的入门,如果一个服务器要连接多个客户端呢?以后有机会和大家一起分享下select的套接字用法。

    5.6K10

    Linux的SOCKET编程详解

    Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统。...Socket是什么 1、 socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –>...应用程序创建套接字后在该套接字可以使用之前,必须调用其他的过程来填充这些字段。 3、文件描述符和文件指针的区别: 文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。...具体如何实现,可以看看linux的内核 4.1、socket()函数 int socket(int protofamily, int type, int protocol);//返回sockfd...原因很简单,如果使用一个描述字的话,那么它的功能太多,使得使用很不直观,同时在内核确实产生了一个这样的新的描述字。

    8.4K10

    Linux系统下socket编程之socket接口介绍(一)

    : 在讲解这个之前,你得必须要明白在Linux系统下,一切皆是文件,(举个简单的例子,一般我们在Windows系统下,你是可以清楚的看到硬盘盘符,并标有大小的,可以直接用鼠标拖拉文件到里面去;而在Linux...三、使用打电话的形式来介绍socket接口函数: 1、调用socket函数(安装电话机)时进行的通话: 问:"接电话需要准备什么?" 答:"当然是电话机!"...说明: int domain(这里domain的中文意思是领域,域名):它是创建套接字所使用的协议栈,通常为AF_INET(也就是IPv4网络协议),下面试各种协议栈的汇总: DESCRIPTION...Since Linux 2.6.27, the type argument serves a second purpose: in addition to specifying a socket type...下面我们来看一下在Linux系统下它的原型: BIND(2) Linux Programmer's Manual

    3K10

    Linux的SOCKET编程详解

    Socket是什么 1、 socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –>...应用程序创建套接字后在该套接字可以使用之前,必须调用其他的过程来填充这些字段。 3、文件描述符和文件指针的区别: 文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。...详细内容请看linux文件系统:http://blog.csdn.net/hguisu/article/details/6122513#t7 4....具体如何实现,可以看看linux的内核 4.1、socket()函数 int socket(int protofamily, int type, int protocol);//返回sockfd...原因很简单,如果使用一个描述字的话,那么它的功能太多,使得使用很不直观,同时在内核确实产生了一个这样的新的描述字。

    2.6K10

    网络编程 - Linux Socket编程

    Linux Socket编程 ---- 目录 前言 Socket的功能 Socket基础 Socket类型 基本结构 基本转换函数 基本Socket使用 TCP Socket实例 UDP Socket实例...本篇不涉及太底层的网络原理,仅说明socket的基本使用方法。主要参考《Linux网络编程》。本篇源码获取方式见文底小字。...基本Socket使用   Linux同时支持面向连接和不连接类型的套接字。在面向连接的通讯中服务器和客户机在交换数据之前先要建立一个连接;在不连接通讯中数据被作为信息的一部分被交换。  ...socket主要使用到如下函数: socket()函数 —— 创建套接字。 bind()函数 —— 绑定socket地址信息。...TCP Socket实例   TCP Socket可以理解为Inet使用流式套接字,为保证通讯稳定而采用TCP协议。其优点在于可靠、稳定。

    9.8K50
    领券