簡體   English   中英

使用 C 在套接字服務器中發送數據

[英]Sending data in socket server using C

我是網絡初學者,正在嘗試學習編寫簡單的服務器。 我嘗試使用 linux 手動命令編寫一個簡單的套接字服務器。 我有幾個問題。 是否可以將數據作為客戶端發送到服務器,然后再次將數據從服務器傳遞到客戶端? 此外,每當我運行我的服務器時,我都會收到這個奇怪的消息,不知道為什么。 在此處輸入圖像描述

另外,我可以在我的代碼中改進什么?

服務器:

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

int main(int argc, char* argv[]) {

    int socket_serv;
    char response[256] = "Connected to server";
    socket_serv = socket(AF_INET, SOCK_STREAM, 0);
    if(socket_serv == -1) {
        perror("Error connecting to server");
    }
    struct sockaddr_in socket_addr;
    socket_addr.sin_family = AF_INET;
    socket_addr.sin_port = htons(8080);
    socket_addr.sin_addr.s_addr = INADDR_ANY;

    bind(socket_serv, (struct sockaddr*) &socket_addr, sizeof(socket_addr));
    listen(socket_serv, 50);
    accept(socket_serv, NULL, NULL);
    
    send(socket_serv, response, sizeof(response), 0);

    return 0;
}

客戶:

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

int main(int argc, char *argv[]) {

    int socket_serv;
    socket_serv = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in socket_addr;
    
    socket_addr.sin_family = AF_INET,
    socket_addr.sin_port = htons(8080);
    socket_addr.sin_addr.s_addr = INADDR_ANY;

    int status  = connect(socket_serv, (struct sockaddr*) &socket_addr, sizeof(socket_addr));
    if(status == -1) {
        perror("cant connect");
    }
    char server_res[256];
    recv(socket_serv, &server_res, sizeof(server_res), 0);

    printf("Data from server: %s", server_res);

    close(socket_serv);

    return 0;
}

在服務器中, accept function 應該在循環中:

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

int main(int argc, char* argv[]) {

    int socket_serv;
    char response[256] = "HTTP/1.1 200 OK\nContent-Length: 20\n\nConnected to server\n";
    socket_serv = socket(AF_INET, SOCK_STREAM, 0);
    if(socket_serv == -1) {
        perror("Error connecting to server");
    }
    struct sockaddr_in socket_addr;
    socket_addr.sin_family = AF_INET;
    socket_addr.sin_port = htons(8080);
    socket_addr.sin_addr.s_addr = INADDR_ANY;

    bind(socket_serv, (struct sockaddr*) &socket_addr, sizeof(socket_addr));
    listen(socket_serv, 50);

    for (;;) {
        int fd = accept(socket_serv, NULL, NULL);
        printf("accepted socket: %d\n", fd);
       
        // read request
        char rbuf[512];
        read(fd, rbuf, 512);
        printf("%s", rbuf);
        
        // send response
        send(fd, response, strlen(response), 0);
        close(fd);
    }


    return 0;
}

循環接受並處理新的連接。 請注意, send發送 strlen(response) 字節,而不是全部 256 個字節。

我在這里放了一read 理想情況下, read應該在循環中讀取所有到達的數據包。

curl -v 127.0.0.1:8080測試它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM