套接字编程:在C中向不同的客户端发送和接收不同的数据 [英] sockets programming: sending and receiving different data to different clients in C

查看:46
本文介绍了套接字编程:在C中向不同的客户端发送和接收不同的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经使用TCP/IP协议在c套接字编程中编写了基本的客户端服务器代码,但是我无法弄清楚如何使其与不同的客户端连接以及如何根据它们的功能向客户端发送/接收不同的数据.(这意味着它的第一个客户端是否向他发送了该数据,以及该客户端是否向该客户端发送了其他数据)等等.

I have written a basic client server code in c socket programming using the TCP/IP protocol but i cant figure out how to make it connect to different clients and send/receive different data to and from them as a function to the client (meaning if its the first client send him that data and if its that client send him the other data) and so on.

这是我发现唯一将相同数据发送到不同客户端的结果.

This is the only results i have found were sending the same data to different clients.

当前服务器:

Current Server:

#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评论,我们可以解决它.

By using original code from geeksforgeeks and Myst comment we can solve it.

您有一台服务器在本地主机127.0.0.1上提供服务,并且在此示例中可以有多个客户端,假设5个客户端就足够了.

You have one server that serves on local host 127.0.0.1, and can have multiple clients for this example i assume 5 clients are enough.

运行一次服务器,然后运行许多客户端以分别连接到该服务器.

Run server once, and run many client to connect seprately to that server.

Server.c

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

运行

Run

使用 gcc client.c -o client gcc server.c -o server

为服务器打开一个终端,然后通过运行 ./server 启动服务器.

Open one terminal for server and start server by run ./server.

现在,您可以通过运行 ./client 将许多客户端[最多5个]连接到该客户端.

Now you can connect many client [up to 5] to it by running ./client.

这篇关于套接字编程:在C中向不同的客户端发送和接收不同的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆