C语言socket编程开发应用示例

下面是关于C语言Socket编程开发应用示例的完整攻略:

什么是Socket编程?

Socket是计算机网络通信中的一种方式,它定义了两个网络应用程序之间的通信规则。Socket编程是指利用Socket进行网络编程,实现网络通信的一种技术。

Socket编程的基础知识

Socket编程主要有两个重要的函数:socket()和bind()。其中,socket()函数用于创建一个Socket,而bind()函数则是将一个Socket与一个本地IP地址和端口号绑定,使得其可以接受来自外部的连接请求。

下面是使用socket()和bind()函数创建和绑定Socket的示例代码:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main() {
    int sockfd, newsockfd, portno;
    socklen_t clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;   
    int n;

    // 创建Socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);   
    if (sockfd < 0) {
        perror("ERROR opening socket");
        return 1;
    }

    // 绑定Socket
    bzero((char *) &serv_addr, sizeof(serv_addr));
    portno = 8080;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portno);
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
        perror("ERROR on binding");
        close(sockfd);
        return 1;
    }

    // 监听Socket
    listen(sockfd, 5);
    clilen = sizeof(cli_addr);

    // 接收连接
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
    if (newsockfd < 0) {
        perror("ERROR on accept");
        close(sockfd);
        return 1;
    }

    // 读取数据
    bzero(buffer, 256);
    n = read(newsockfd, buffer, 255);
    if (n < 0) {
        perror("ERROR reading from socket");
        close(newsockfd);
        close(sockfd);
        return 1;
    }
    printf("Here is the message: %s\n", buffer);

    // 向客户端发送数据
    n = write(newsockfd, "I got your message", 18);
    if (n < 0) {
        perror("ERROR writing to socket");
        close(newsockfd);
        close(sockfd);
        return 1;
    }

    // 关闭Socket
    close(newsockfd);
    close(sockfd);

    return 0;
}

上述代码将创建一个Socket并绑定到本地的8080端口,随后进入监听状态。该程序支持一个客户端连接请求,一旦收到连接请求就会向客户端发送"I got your message"消息。

Socket编程应用实例

现在我们将使用Socket编程来创建一个简单的客户端/服务器应用程序。在这个例子中,客户端将向服务器请求当前时间,然后服务器将向客户端返回当前时间并在客户端上打印。

服务器端代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main() {
    int sockfd, newsockfd, portno;
    socklen_t clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;   
    int n;

    // 创建Socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);   
    if (sockfd < 0) {
        perror("ERROR opening socket");
        return 1;
    }

    // 绑定Socket
    bzero((char *) &serv_addr, sizeof(serv_addr));
    portno = 8080;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portno);
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
        perror("ERROR on binding");
        close(sockfd);
        return 1;
    }

    // 监听Socket
    listen(sockfd, 5);
    clilen = sizeof(cli_addr);

    // 接收连接请求
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
    if (newsockfd < 0) {
        perror("ERROR on accept");
        close(sockfd);
        return 1;
    }

    // 读取数据
    bzero(buffer, 256);
    n = read(newsockfd, buffer, 255);
    if (n < 0) {
        perror("ERROR reading from socket");
        close(newsockfd);
        close(sockfd);
        return 1;
    }

    // 获取当前时间
    time_t t;
    time(&t);
    struct tm *local = localtime(&t);
    char *result = asctime(local);

    // 向客户端发送数据
    n = write(newsockfd, result, strlen(result));
    if (n < 0) {
        perror("ERROR writing to socket");
        close(newsockfd);
        close(sockfd);
        return 1;
    }

    // 关闭Socket
    close(newsockfd);
    close(sockfd);

    return 0;
}

客户端代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

int main() {
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[256];
    portno = 8080;

    // 创建Socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("ERROR opening socket");
        return 1;
    }

    // 获取指定主机的信息
    server = gethostbyname("localhost");
    if (server == NULL) {
        perror("ERROR, no such host");
        return 1;
    }

    // 初始化服务器地址
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *) server->h_addr, (char *) &serv_addr.sin_addr.s_addr, server->h_length);
    serv_addr.sin_port = htons(portno);

    // 连接服务器
    if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
        perror("ERROR connecting");
        return 1;
    }

    // 向服务器发送请求
    n = write(sockfd, "Please send me current time.", 29);
    if (n < 0) {
        perror("ERROR writing to socket");
        close(sockfd);
        return 1;
    }

    // 从服务器接收结果
    bzero(buffer, 256);
    n = read(sockfd, buffer, 255);
    if (n < 0) {
        perror("ERROR reading from socket");
        close(sockfd);
        return 1;
    }

    // 打印当前时间
    printf("%s", buffer);

    // 关闭Socket
    close(sockfd);

    return 0;
}

在上述客户端/服务器应用程序中,客户端向服务器发送"Please send me current time."请求,一旦接收到请求,服务器将会返回当前时间。

我希望本攻略对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言socket编程开发应用示例 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 利用C语言实现2048小游戏的方法

    利用C语言实现2048小游戏的方法 项目描述: 2048是一种非常受欢迎的数字连线游戏。玩家需要通过滑动数字来合并相同的数字,得到更高的分数。在这个项目中,我们将展示如何使用C语言实现2048小游戏的完整方法。 实现步骤: 步骤一:创建格子矩阵 2048小游戏是一个4×4的矩阵,我们可以使用一个二维数组来表示这个矩阵。代码可以使用如下的方式进行: int m…

    C 2023年5月23日
    00
  • C语言深入讲解栈与堆和静态存储区的使用

    C语言深入讲解栈与堆和静态存储区的使用 什么是栈 栈是一种数据结构,具有先进后出的特点。在C语言中,栈通常用来存储函数调用的相关信息,例如函数的参数和局部变量等。C语言栈的大小是有限制的,当栈的使用超出其大小时,就会导致栈溢出。 栈的使用 C语言中的栈是由操作系统在运行时进行分配的。当函数被调用时,操作系统会分配一段连续的内存空间,用于存储该函数的参数和局部…

    C 2023年5月23日
    00
  • C语言详解如何实现顺序栈

    当我们需要实现一个顺序栈时,需要先定义栈结构体,然后实现栈的基本操作,包括入栈、出栈等。以下为具体步骤: 1. 定义栈结构体 定义一个结构体,包含栈的基本属性: typedef struct SeqStack { int *data; // 栈的元素存储空间 int size; // 栈的大小 int top; // 栈顶指针 } SeqStack; 其中,…

    C 2023年5月23日
    00
  • C#创建线程带参数的方法

    C#创建线程带参数的方法,可以通过委托和Lambda表达式实现。以下是详细的攻略: 委托和Lambda表达式的简介 委托是C#中一个非常重要的概念,它是一种指向方法的指针,能够在需要的时候再调用这个方法。Lambda表达式是C#3.0引入的一项新特性,它是一种简化创建委托的语法。Lambda表达式实质是一个匿名函数,总是由多个参数,一个箭头符号和一个表达式组…

    C 2023年5月22日
    00
  • C++ 系统String类详解

    C++ 系统String类详解 引言 在 C++ 语言中,字符串 (String) 是一种非常常见的数据类型。在使用中,我们可以选择使用系统默认提供的String类,也可以选择使用第三方库提供的字符串类库。本文将详细讲解C++系统String类以及其相关使用技巧。 String类简介 String类是C++标准库中提供的一个数据类型,定义在头文件 中。Str…

    C 2023年5月30日
    00
  • MongoDB导出查询结果到文件例子

    MongoDB导出查询结果到文件主要有两种方式:使用mongoexport命令和使用db.collection.find().forEach()方法,下面分别进行讲解: 使用mongoexport命令导出查询结果到文件 语法: mongoexport -d <database_name> -c <collection_name> -q…

    C 2023年5月23日
    00
  • C语言宏定义容易认不清的盲区梳理

    C语言宏定义容易认不清的盲区梳理 在C语言中,宏定义可以方便地定义一些常量、变量、函数等。然而,在使用宏定义时也有一些容易混淆的盲区,这里给出一些梳理。 1. 宏定义和函数定义的区别 宏定义和函数定义都可以定义函数(或函数形式的代码块),但二者存在明显的区别。 宏定义直接将定义的字符串替换到代码中,而函数需要调用才能执行。 #define SQUARE(x)…

    C 2023年5月23日
    00
  • SQL2000个人版 应用程序正常初始化失败0乘以C0000135失败

    首先,需要明确的是,这个错误通常是由于系统缺失或损坏了必要的 Microsoft Visual C++ Redistributable 库文件所导致的。为解决这个问题,通常需要重新安装或修复这些库文件。 以下是一个可能的攻略,步骤如下: 下载并安装最新版的 Microsoft Visual C++ Redistributable 库文件。可以从 Micros…

    C 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部