如何写入我在 C 中的另一个文件中创建的套接字?

问题描述

我有两个 c 文件,服务器和客户端。服务器侦听并接受来自客户端的连接请求,然后等待打印出客户端提供给它的消息。连接过程完美运行,但我不知道如何让它中继它应该接收的消息。

由于这两个文件是分开的,我不确定将哪个文件描述符放入客户端的 write() 调用中。服务器中的 read() 调用在客户端中的 write() 调用之前被调用,它使用文件描述符 s2,这是其 accept() 调用输出

如何让我的客户端文件中的 write() 调用与服务器文件中的 read() 调用正在寻找的同一个套接字通信?

为了节省时间,下面的代码省略了一些错误检查等功能

这是我的 server.c 文件内容

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

     char buffer[257];
     int pipe_fds;
     int psts; // Holds result of pipe creation attempt
     psts = my_pipe(pipe_fds);

     if(psts == 0) { // If pipe is successful
             printf(" SERVER: Server running...\n");
             printf(" SERVER: Waiting for message...\n");
             read(pipe_fds,buffer,257); // <---------- Output stops here
             printf(" SERVER: Message: %s\n",buffer);

             close(pipe_fds);
     }
     return 0;
}

这是上面块中使用的函数my_pipe()

int my_pipe(int fd) {

// SET UP CONNECTION REQUEST SOCKET: S1 -------------------------------------------
    int s1 = socket(AF_UNIX,SOCK_STREAM,0);
    if(s1 == -1) {return -1;}

    struct sockaddr name1 = {AF_UNIX,"ServerSocket"};
    socklen_t namelen1 = sizeof(struct sockaddr) + 13;
    bind(s1,&name1,namelen1);

    printf("\n SERVER: [s1] Socket Created! \n");

// SET UP LISTEN/ACCEPT -----------------------------------------------------------
    if(listen(s1,1) == -1) {return -1;}

    printf("\n SERVER: Server Listening! \n\n");

// SET UP CLIENT CONNECTION SOCKET: S2 --------------------------------------------
    struct sockaddr name1_0;
    socklen_t namelen1_0;

    int s2 = accept(s1,&name1_0,&namelen1_0); // <----------- This is where s2 is defined
    if(s2 == -1) {return -1;}
    printf(" SERVER: Client Found...\n");

    fd = s2;
    close(s1);
    return 0;
}

最后,这是我的 client.c 文件内容

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

    char buffer[257];

    // Create a socket to connect to the server with
    int s0 = socket(AF_UNIX,0);
    if(s0 == -1) { return -1; }

    // Create a sockaddr for the kNown existing socket "ServerSocket"
    struct sockaddr server_name = {AF_UNIX,"ServerSocket"};
    socklen_t server_len = sizeof(struct sockaddr) + 13;

    // Connect to "ServerSocket"
    if(connect(s0,&server_name,server_len) == -1) {return -1;}

    printf("CLIENT: Client Connected!\n");
    strcpy(buffer,"This is the Client Message.");
    write([INSERT SERVER SOCKET FD],strlen(buffer) + 1); // <----- The line in question

    printf("CLIENT: Message Sent!\n");

    close(s0);
    return 0;
}

运行这两个文件的服务器输出

 SERVER: [s1] Socket Created!

 SERVER: Server Listening!

 SERVER: Client Found...
 SERVER: Server running...
 SERVER: Waiting for message...
 (infinite waiting)

解决方法

只是一些通用逻辑的伪代码,可能对一般理解有用。 简而言之,您首先设置服务器,accept 的返回为您提供客户端套接字。 所以你有2个不同的插座。您不再需要服务器套接字并关闭服务器套接字,因此它可以接受进一步的连接(一次只能接受一个)。你可以 获取客户端套接字并将其传递给函数或 fork() 或将其传递给线程 - 一切由您决定。

     main () {
          int server_socket;
          server_socket = socket(AF_INET,....);
          init(addrinfo()) // initialize server_socket
          bind //port
          listen // set backlog queue,number of allowed waiting connections)
          while (1) { //loop to wait for incoming connections
              int client_socket = accept(server_socket....) //client connection !
              close(server_socket); // otherwise blocked
              my_pipe(&client_socket) /pass client socket to function
          }

          my_pipe(*socket) {
          read/write //send/recv 
          close(socket);
          }