首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

網絡編程實戰:基於 Beej's Guide 的 Client/Server 完整代碼示例

     編輯:關於C語言

翻譯了那麼多章《Beej's Guide to Network Programming》,是時候動手寫一個簡單的客戶端和服務器端程序了!

客戶端流程

getaddrinfo() → socket() → connect() → recv()

客戶端完整代碼

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>

#define SERVIP   "192.168.56.112"
#define SERVPORT "2349"

int main(int argc, char *argv[])
{
    struct addrinfo hints, *res;
    int status;
    int sockfd;
    int connSta;
    int recvSta;
    char buffer[1024];
    char ipstr[INET_ADDRSTRLEN];
    void *addr;

    if (argc != 3) {
        fprintf(stderr, "Usage: %s  \n", argv[0]);
        return 1;
    }

    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;

    status = getaddrinfo(argv[1], argv[2], &hints, &res);
    if (status != 0) {
        fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
        return 2;
    }

    sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    if (sockfd == -1) {
        perror("socket");
        return 3;
    }

    connSta = connect(sockfd, res->ai_addr, res->ai_addrlen);
    if (connSta != 0) {
        perror("connect");
        return 4;
    } else {
        struct sockaddr_in *ipv4 = (struct sockaddr_in *)res->ai_addr;
        addr = &(ipv4->sin_addr);
        inet_ntop(res->ai_family, addr, ipstr, sizeof(ipstr));
        printf("Connected: Host = %s, Port = %d\n", ipstr, ntohs(ipv4->sin_port));
    }

    recvSta = recv(sockfd, buffer, sizeof(buffer), 0);
    if (recvSta > 0) {
        buffer[recvSta] = '\0';
        printf("\n%s\n", buffer);
    }

    freeaddrinfo(res);
    close(sockfd);
    return 0;
}

服務器端流程

getaddrinfo() → socket() → bind() → listen() → accept() → send()

服務器端完整代碼

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>

#define SERVPORT "2349"

int main(int argc, char *argv[])
{
    struct addrinfo hints, *res;
    int status;
    int sockfd;
    int connFd;
    struct sockaddr_in cliAddr;
    int sendSta;
    char *msg;

    if (argc != 2) {
        fprintf(stderr, "Usage: %s \n", argv[0]);
        return 1;
    }

    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;

    status = getaddrinfo(NULL, SERVPORT, &hints, &res);
    if (status != 0) {
        fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
        return 2;
    }

    sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    if (sockfd == -1) {
        perror("socket");
        return 3;
    }

    if (bind(sockfd, res->ai_addr, res->ai_addrlen) == -1) {
        perror("bind");
        return 4;
    }

    if (listen(sockfd, 5) == -1) {
        perror("listen");
        return 5;
    }

    printf("======== Please Wait Client =========\n");

    while (1) {
        char ipstr[INET_ADDRSTRLEN];
        void *addr;
        int len = sizeof(cliAddr);
        connFd = accept(sockfd, (struct sockaddr *)&cliAddr, &len);
        if (connFd == -1) {
            perror("accept");
            continue;
        }

        /* 顯示客戶端 IP */
        struct sockaddr_in *ipv4 = (struct sockaddr_in *)&cliAddr;
        addr = &(ipv4->sin_addr);
        inet_ntop(AF_INET, addr, ipstr, sizeof(ipstr));
        printf("Client: %s\n", ipstr);

        /* 發送數據 */
        msg = "Hello world!";
        sendSta = send(connFd, msg, strlen(msg), 0);
        if (sendSta == -1) {
            perror("send");
        }

        close(connFd);
    }

    close(sockfd);
    return 0;
}

摘自 xiaobin_HLJ80 的專欄

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved