套接字编程:在C中向不同的客户端发送和接收不同的数据

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

我已经使用 TCP/IP 协议在 c 套接字编程中编写了一个基本的客户端服务器代码,但我无法弄清楚如何让它连接到不同的客户端和 send/receive 与它们之间的不同数据作为客户端的函数(意味着如果它的第一个客户端向他发送该数据,如果它的那个客户端向他发送其他数据)等等。

这是我发现的向不同客户端发送相同数据的唯一结果。

当前服务器:

#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.c

// 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.c

// 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] 连接到它。