簡體   English   中英

套接字編程:在C中向不同的客戶端發送和接收不同的數據

[英]sockets programming: sending and receiving different data to different clients in C

我已經使用TCP / IP協議在c套接字編程中編寫了基本的客戶端服務器代碼,但是我無法弄清楚如何使其連接到不同的客戶端,以及作為功能向客戶端發送/接收來自它們的不同數據(意思是如果其第一個客戶端向他發送該數據,如果該客戶端向他發送其他數據),依此類推。

這是我發現將相同數據發送到不同客戶端的唯一結果。

當前服務器:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/types.h>

#include <netinet/in.h>

int main() {

  char server_message[100] = {0};
  int server_socket = 0;
  int client_socket = 0;

  struct sockaddr_in server_address;  

  server_socket = socket(AF_INET, SOCK_STREAM, 0);

  server_address.sin_family = AF_INET;
  server_address.sin_port = htons(9002);
  server_address.sin_addr.s_addr = INADDR_ANY;

  // bind the socket to our specified IP and port
  bind(server_socket, (struct sockaddr*) &server_address, sizeof(server_address));

  listen(server_socket, 2);

  client_socket = accept(server_socket, NULL, NULL);

  printf("Please enter a massage:");
  fgets(server_message, 100, stdin);

  send(client_socket, server_message, sizeof(server_message), 0);

  close(server_socket);
  return 0;
}

通過使用geeksforgeeks和Myst注釋中的原始代碼,我們可以解決它。

您有一個在本地主機127.0.0.1上服務的服務器,並且在此示例中可以有多個客戶端,假設5個客戶端就足夠了。

一次運行服務器,然后運行許多客戶端以分別連接到該服務器。

服務器

// Server side C/C++ program to demonstrate Socket programming 
#include <unistd.h> 
#include <stdio.h> 
#include <sys/socket.h> 
#include <stdlib.h> 
#include <netinet/in.h> 
#include <string.h> 
#define PORT 8080 
#define STRING_SIZE 100
#define BUFFER_SIZE 100

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

    int server_fd, new_socket[5], valread; 
    struct sockaddr_in address; 
    int opt = 1; 
    int addrlen = sizeof(address); 
    char buffer[1024] = {0}; 

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

    // Forcefully attaching socket to the port 8080 
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, 
                                                &opt, sizeof(opt))) 
    { 
        perror("setsockopt"); 
        exit(EXIT_FAILURE); 
    } 
    address.sin_family = AF_INET; 
    address.sin_addr.s_addr = INADDR_ANY; 
    address.sin_port = htons( PORT ); 

    // Forcefully attaching socket to the port 8080 
    if (bind(server_fd, (struct sockaddr *)&address, 
                                sizeof(address))<0) 
    { 
        perror("bind failed"); 
        exit(EXIT_FAILURE); 
    } 
    if (listen(server_fd, 3) < 0) 
    { 
        perror("listen"); 
        exit(EXIT_FAILURE); 
    }

    for (int i=0;i<5;i++){ 
        if ((new_socket[i] = accept(server_fd, (struct sockaddr *)&address, 
                        (socklen_t*)&addrlen))<0) 
        { 
            perror("accept"); 
            exit(EXIT_FAILURE); 
        } 
    valread = read(new_socket[i], buffer, 1024); 
    printf("%s\n", buffer);

    char send_buf[STRING_SIZE] = "hello";
    char buf[BUFFER_SIZE]={0};
    sprintf(buf, "%d", i);
    strcat(send_buf, buf);

    send(new_socket[i], send_buf, strlen(send_buf), 0); 
    //printf("Hello message sent\n"); 

    }

    return 0; 
} 

客戶端

// Client side C/C++ program to demonstrate Socket programming 
#include <stdio.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <string.h> 
#define PORT 8080 

int main(int argc, char const *argv[]) 
{ 
    int sock = 0, valread; 
    struct sockaddr_in serv_addr; 
    char *hello = "Hello from client"; 
    char buffer[1024] = {0}; 
    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(PORT); 

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

    return 0; 
} 

使用gcc client.c -o clientgcc server.c -o server編譯代碼后

打開一個服務器終端,然后通過運行./server啟動服務器。

現在,您可以通過運行./client來連接許多客戶端(最多5個)。

暫無
暫無

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

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