问题描述
我有两个 c 文件,服务器和客户端。服务器侦听并接受来自客户端的连接请求,然后等待打印出客户端提供给它的消息。连接过程完美运行,但我不知道如何让它中继它应该接收的消息。
由于这两个文件是分开的,我不确定将哪个文件描述符放入客户端的 write() 调用中。服务器中的 read() 调用在客户端中的 write() 调用之前被调用,它使用文件描述符 s2,这是其 accept() 调用的输出。
如何让我的客户端文件中的 write() 调用与服务器文件中的 read() 调用正在寻找的同一个套接字通信?
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;
}
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);
}