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

linux socket程序

Linux Socket程序是一种用于实现网络通信的应用程序,它允许不同计算机之间的进程进行数据交换。Socket(套接字)是一种通信端点,它允许不同计算机上的进程通过一个网络进行通信。

基础概念

  1. Socket类型
    • 流式Socket(SOCK_STREAM):提供可靠的、面向连接的通信流,如TCP协议。
    • 数据报Socket(SOCK_DGRAM):提供无连接的、不可靠的数据报服务,如UDP协议。
  • 地址族
    • AF_INET:IPv4地址族。
    • AF_INET6:IPv6地址族。
  • 常用函数
    • socket():创建一个套接字。
    • bind():将套接字绑定到一个地址。
    • listen():监听传入连接。
    • accept():接受一个传入连接。
    • connect():连接到服务器。
    • send()recv():发送和接收数据。
    • close():关闭套接字。

优势

  • 跨平台性:Socket编程可以在不同的操作系统上实现。
  • 灵活性:支持多种协议(TCP/UDP)和地址族。
  • 高效性:直接与网络层交互,减少了中间环节。

类型

  • TCP Socket:面向连接,可靠传输。
  • UDP Socket:无连接,速度快但不保证数据包的顺序和完整性。

应用场景

  • Web服务器和客户端:HTTP/HTTPS协议基于TCP。
  • 实时通信系统:如在线游戏、聊天应用,可能使用UDP以实现低延迟。
  • 远程登录服务:如SSH,使用TCP确保数据的安全性和完整性。

示例代码(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);

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

    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");
        exit(EXIT_FAILURE);
    }

    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }

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

    char buffer[1024] = {0};
    read(new_socket, buffer, 1024);
    printf("Message from client: %s\n", buffer);
    close(new_socket);
    close(server_fd);
    return 0;
}

客户端

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

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char *hello = "Hello from client";
    char buffer[1024] = {0};

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("\n Socket creation error \n");
        return -1;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(8080);

    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        printf("\nInvalid address/ Address not supported \n");
        return -1;
    }

    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        printf("\nConnection Failed \n");
        return -1;
    }

    send(sock, hello, strlen(hello), 0);
    read(sock, buffer, 1024);
    printf("Message from server: %s\n", buffer);
    close(sock);
    return 0;
}

常见问题及解决方法

  1. 连接超时
    • 原因:网络延迟或服务器未响应。
    • 解决方法:增加超时设置,检查服务器状态。
  • 数据丢失
    • 原因:网络不稳定或程序错误。
    • 解决方法:使用TCP协议保证数据完整性,或在UDP基础上实现重传机制。
  • 端口冲突
    • 原因:多个应用尝试绑定同一端口。
    • 解决方法:更改端口号或使用动态端口分配。

通过以上信息,你应该能够理解Linux Socket程序的基础概念、优势、类型、应用场景以及常见问题的解决方法。

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

相关·内容

linux socket udp编程_linux网络编程socket

二、UDP 数据报服务特点 发送端应用程序每执行一次写操作,UDP 模块就将其封装成一个 UDP 数据报发送。接收端必须及时针对每一个 UDP 数据报执行读操作,否则就会丢包。...并且,如果用户没有指定足够的应用程序缓冲区来读取 UDP 数据,则 UDP 数据将被截断。 因此,采用UDP协议时必须要求接收端可以一次性收取完发送端一次发送的数据,不然就会造成数据丢失。...二、UDP 编程流程 1.服务器 代码如下(示例): int main() { int sockfd = socket(AF_INET,SOCK_DGRAM,0); assert( sockfd...sockaddr*)&caddr,sizeof(caddr)); } close(sockfd); exit(0); } 2.客户端 代码如下(示例): int main() { int sockfd = socket...发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/196086.html原文链接:https://javaforall.cn

9.9K20

【Linux】: Socket 编程

客户端程序的端口号, 就是由操作系统从这个范围分配的 3....接收主机把从网络上接收到的字节依次保存在接收缓冲区中,同样按内存地址从低到高的顺序保存 因此,网络数据流的地址应规定为:先发出的数据是低地址,后发出的数据是高地址 网络字节序与主机字节序之间的转换 为使网络程序具有可移植性...通过 Socket API,程序可以实现跨网络的进程间通信(如通过IP地址和端口号进行的网络通信),也可以实现本地的进程间通信。...在程序中,套接字函数接受 sockaddr* 类型的参数,然后根据具体的通信类型进行处理。...* 类型表示,在使用的时候需要强制转化成sockaddr_in,这样的好处是程序的通用性,可以接收IPv4, IPv6, 以及UNIX Domain Socket各种类型的 ​​​​​​​sockaddr

13910
  • 【Linux】:Socket编程 TCP

    函数原型(C/C++) 在 POSIX 系统(如 Linux)中,listen 函数的原型如下: int listen(int sockfd, int backlog); 在 Windows 系统中,listen...函数原型(C/C++) 在 POSIX 系统(如 Linux)中,accept 函数的原型如下: int accept(int sockfd, struct sockaddr *addr, socklen_t...else break; } ::close(sockfd); return 0; } 演示如下: 2.6 fd 浪费 文件描述符(File Descriptor, FD)泄露是指程序在运行过程中打开了文件或其他资源...文件描述符泄露会导致系统资源耗尽,进而引发程序崩溃或系统性能下降。...EchoServer -- 线程池 引入我们之前写的【Linux】:线程库 Thread.hpp 简单封装 Thread.hpp 以及 单例模式下的【Linux】:日志策略 + 线程池(单例模式 Threadpool.hpp

    8710

    【Linux】Socket编程—TCP

    TCP socket API 详解   下面介绍程序中用到的 socket API,这些函数都在 sys/socket.h 中。...socket() 作用:打开一个网络通讯端口,如果成功的话,就像 open()一样返回一个文件描述符; 应用程序可以像读写文件一样用 read/write 在网络上收发数据; 返回值:如果 socket...bind() 介绍:服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接; 服务器需要调用 bind 绑定一个固定的网络地址和端口号;...struct sockaddr *是一个通用指针类型,myaddr 参数实际上可以接受多种协议的 sockaddr 结构体,而它们的长度各不相同,所以需要第三个参数 addrlen指定结构体的长度;我们的程序中对...value-result argument), 传入的是调用者提供的, 缓冲区 addr 的长度以避免缓冲区溢出问题, 传出的是客户端地址结构体的实际长度(有可能没有占满调用者提供的缓冲区); 我们的服务器程序结构是这样的

    8810

    linux下socket编程

    Socket soket接口是TCP/IP网络的API。网络的socket数据传输是一种特别的I/O,socket也是一种文档描述符。...常用的socket类型有:流式socket(SOCK_STREAM)、数据报socket(SOCK_DGRAM)....其中流式socket是采用面向连接的TCP服务,而数据报socket则是无连接的UDP服务 Socket建立     调用: int socket(int domain, int type, int...收到连接请求时,socket执行体将建立一个新的socket,执行体将这个新socket和请求连接进程的地址联系起来,收到服务请求的初始socket仍能够继续在以前的 socket上监听,同时能够在新的...flags:一般设置为0     返回实际上发送出的字节数,可能会少于希望发送的数据;在程序中应该将send发送的数据和len进行比较,若不匹配时,应该进行处理 char *msg = "hello

    4K70

    Linux Socket 收发Json

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

    4.7K20

    linux网络编程之socket(二):CS程序的一般流程和基本socket函数

    一、基于TCP协议的网络程序 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态...数据传输的过程: 建立连接后,TCP协议提供全双工的通信服务,但是一般的客户端/服务器程序的流程是由客户端主动发起请求,服务器被动处理请求,一问一答的方式。...在学习socket API时要注意应用程序和TCP协议层是如何交互的:  *应用程序调用某个socket函数时TCP协议层完成什么动作,比如调用connect()会发出SYN段  *应用程序如何知道TCP...二、基本socket函数 1、socket函数 包含头文件socket.h> 功能:创建一个套接字用于通信 原型:int socket(int domain, int type, int...socklen_t addrlen); 参数 sockfd:未连接套接字 addr:要连接的套接字地址 addrlen:第二个参数addr长度 返回值:成功返回0,失败返回-1 参考: 《Linux

    1.5K10

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

    前言 在上一篇文章里面我们介绍了TCP的三次握手和四次挥手过程的介绍以及网络编程里面的一些api接口函数的介绍——Linux系统下socket编程之socket接口介绍(一)。...不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。...不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。...(这个转换完后不能用于网络传输,还需要调用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通信中的点对点通信,多播,广播等。...具体通信流程如下所示: 上面的通信过程还是比较清晰的,在实际的使用过程中,有几点需要注意下: 1、我们在编写服务端UDP程序时,bind是一个必须的步骤,这样系统才能知道我们程序recvfrom想从哪里或者哪个端口得到数据...,sizeof(set_broadcast)); 四、注意事项 1、在某些情况下,我们的服务端的程序需要同时使用单播、组播和广播的方式,且一般的程序都会使用指定的端口。...,在广播完成后, 程序会建立一个UDP的单播客户端,等待感兴趣的客户端发送信息。...(int)); if (ret < 0) { perror("socket set SO_REUSEADDR failed"); } 2、服务端程序,在创建完socket后,有一个bind的操作

    11.1K10

    Linux C Socket Api详解

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

    5.6K10

    Linux的SOCKET编程详解

    Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统。...就目前而言,几乎所有的应用程序都是采用socket,而现在又是网络时代,网络中进程通信是无处不在,这就是我为什么说“一切皆socket”。 2....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,而现在又是网络时代,网络中进程通信是无处不在,这就是我为什么说“一切皆socket”。 2....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的功能   socket是通过标准的UNIX文件描述符和其他的程序通讯的一个方法。其可以实现同一主机不同进程间的通信;也可以实现不同主机间的通信。...它功能强大,但是没有上面介绍的两种套接字使用方便,一般的程序也涉及不到原始套接字。 基本结构 struct sockaddr 此结构用于存储套接字地址。...基本Socket使用   Linux同时支持面向连接和不连接类型的套接字。在面向连接的通讯中服务器和客户机在交换数据之前先要建立一个连接;在不连接通讯中数据被作为信息的一部分被交换。

    9.8K50
    领券