czm761201 发表于 2023-3-27 15:52:21

程序

用c++写一段通讯程序

chatGPT_小智 发表于 2023-3-27 15:53:37

以下是一个简单的C++通讯程序示例,使用socket实现了客户端与服务端的简单通信。

服务端代码:


++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

#define PORT 8080

int main(int argc, char *argv[]) {
    int sockfd, newsockfd, n;
    socklen_t clientlen;
    char buffer;
    struct sockaddr_in serv_addr, cli_addr;

    // 创建 socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
      perror(\"Error opening socket\");
      exit(1);
    }

    // 绑定端口号
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(PORT);

    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
      perror(\"Error on binding\");
      exit(1);
    }

    // 监听端口
    listen(sockfd, 5);

    printf(\"Server: Listening on port %d...\\n\", PORT);

    // 接受客户端连接
    clientlen = sizeof(cli_addr);
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clientlen);
    if (newsockfd < 0) {
      perror(\"Error on accept\");
      exit(1);
    }

    printf(\"Server: Client connected from %s:%d\\n\",
         inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port));

    // 读取客户端消息
    bzero(buffer, 256);
    n = read(newsockfd, buffer, 255);

    if (n < 0) {
      perror(\"Error reading from socket\");
      exit(1);
    }

    printf(\"Server: Here is the message received: %s\\n\", buffer);

    // 发送响应给客户端
    n = write(newsockfd, \"I got your message\", 18);
    if (n < 0) {
      perror(\"Error writing to socket\");
      exit(1);
    }

    close(sockfd);
    close(newsockfd);

    return 0;
}


客户端代码:


++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>

#define PORT 8080

int main(int argc, char *argv[]) {
    int sockfd, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer;
    if (argc < 2) {
      fprintf(stderr,\"usage %s hostname\\n\", argv);
      exit(1);
    }

    // 获取服务器地址
    server = gethostbyname(argv);
    if (server == NULL) {
      fprintf(stderr, \"Error, no such host\\n\");
      exit(0);
    }

    // 创建 socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
      perror(\"Error opening socket\");
      exit(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(PORT);

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

    printf(\"Client: Connected to server %s:%d\\n\",
         inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port));

    // 发送消息给服务端
    printf(\"Client: Please enter the message: \");
    bzero(buffer,256);
    fgets(buffer,255,stdin);
    n = write(sockfd, buffer, strlen(buffer));
    if (n < 0) {
      perror(\"Error writing to socket\");
      exit(1);
    }

    // 读取服务端响应
    bzero(buffer, 256);
    n = read(sockfd, buffer, 255);

    if (n < 0) {
      perror(\"Error reading from socket\");
      exit(1);
    }

    printf(\"Client: Here is the message received: %s\\n\",buffer);

    close(sockfd);

    return 0;
}


运行服务端程序后,可以使用客户端程序与其通讯。
页: [1]
查看完整版本: 程序