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

linux socket编程函数

Linux Socket编程是一种网络通信机制,它允许不同计算机上的应用程序通过一个共同的协议进行数据交换。Socket API提供了一系列函数,用于创建、配置、连接、监听、发送和接收数据。

基础概念

  • Socket:Socket是网络通信的基本构建块,它允许应用程序通过网络发送和接收数据。
  • IP地址:标识网络中的设备。
  • 端口号:标识设备上的特定服务或应用程序。
  • 协议:定义数据如何在网络中传输,常见的协议有TCP和UDP。

相关函数

  • socket():创建一个新的socket。
  • bind():将socket绑定到一个IP地址和端口上。
  • listen():将socket设置为监听模式,等待连接请求。
  • accept():接受一个来自客户端的连接请求。
  • connect():客户端使用此函数连接到服务器。
  • send()/recv():发送和接收数据。
  • close():关闭socket。

类型

  • 流式Socket (SOCK_STREAM):基于TCP协议,提供可靠的、面向连接的通信流。
  • 数据报Socket (SOCK_DGRAM):基于UDP协议,提供不可靠的、无连接的通信。

应用场景

  • Web服务器:如Apache或Nginx,使用socket监听HTTP请求。
  • 聊天应用:实时通信应用,如即时消息服务。
  • 文件传输:如FTP服务器,用于文件的上传和下载。
  • 远程登录:如SSH服务,允许用户远程访问服务器。

常见问题及解决方法

问题:为什么我的服务器无法接收客户端的连接?

原因

  • 服务器未正确绑定到IP地址和端口。
  • 端口已被其他应用程序占用。
  • 防火墙或安全组设置阻止了连接。

解决方法

  • 确保服务器代码正确调用了bind()函数,并指定了正确的IP地址和端口。
  • 使用netstatlsof命令检查端口是否被占用。
  • 检查防火墙设置,确保允许相应的端口通信。

问题:为什么我的客户端无法连接到服务器?

原因

  • 服务器未运行或未监听正确的端口。
  • 客户端使用的IP地址或端口不正确。
  • 网络问题,如路由器配置错误或网络中断。

解决方法

  • 确保服务器正在运行,并且监听了正确的端口。
  • 检查客户端代码中的IP地址和端口设置。
  • 使用pingtraceroute命令检查网络连通性。

示例代码

以下是一个简单的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);
    char buffer[1024] = {0};
    const char *hello = "Hello from server";

    // Creating socket file descriptor
    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);

    // Binding the socket to the IP / port
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    // Listening for incoming connections
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }

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

    send(new_socket, hello, strlen(hello), 0);
    printf("Hello message sent\n");
    valread = read(new_socket, buffer, 1024);
    printf("%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() {
    struct sockaddr_in serv_addr;
    int sock = 0;
    char buffer[1024] = {0};
    const char *hello = "Hello from client";

    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);

    // Convert IPv4 and IPv6 addresses from text to binary form
    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 );
    printf("Hello message sent\n");
    valread = read( sock , buffer, 1024);
    printf("%s\n",buffer );
    close(sock);
    return 0;
}

参考链接

请注意,以上代码仅用于演示目的,实际应用中需要考虑更多的错误处理和资源管理。

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

相关·内容

21分9秒

080_尚硅谷课程系列之Linux_扩展篇_Shell编程(七)_函数(一)_系统函数

21分9秒

080_尚硅谷课程系列之Linux_扩展篇_Shell编程(七)_函数(一)_系统函数

15分42秒

081_尚硅谷课程系列之Linux_扩展篇_Shell编程(七)_函数(二)_自定义函数

15分42秒

081_尚硅谷课程系列之Linux_扩展篇_Shell编程(七)_函数(二)_自定义函数

15分11秒

048_尚硅谷_Scala_函数式编程(一)_函数式编程思想

10分3秒

050_尚硅谷_Scala_函数式编程(二)_函数基础(二)_函数定义

13分12秒

049_尚硅谷_Scala_函数式编程(二)_函数基础(一)_函数和方法

59分10秒

13shell编程之函数实现

11分41秒

055_尚硅谷_Scala_函数式编程(三)_函数高级(二)_高阶函数(一)_函数作为值传递

4分34秒

056_尚硅谷_Scala_函数式编程(三)_函数高级(二)_高阶函数(二)_函数作为参数传递

12分38秒

051_尚硅谷_Scala_函数式编程(二)_函数基础(三)_函数参数特殊用法

18分56秒

052_尚硅谷_Scala_函数式编程(二)_函数基础(四)_函数至简原则

领券