我的服务器遇到了一些问题。我正在尝试从多个客户端读取输入,但我一次只能做一个。我认为我的服务器代码没有问题。所以我假设我的本地客户是真正有问题的客户。如果我想处理具有不同套接字的多个客户端,那么每个客户端是否与另一个客户端完全相同。或者它们在某些方面有所不同?
你们有什么想法?
Server.c
#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <stdlib.h>
//char *socket_path = "./socket";
char *socket_path = "\0hidden";
int main(int argc, char *argv[]) {
struct sockaddr_un addr;
//max client sockets
int max_sd, sd, i, client_socket[3], activity;
char buf[100];
int fd,cl,rc;
fd_set readfds;
if (argc > 3) socket_path=argv[3];
//establish socket
if ( (fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket error");
exit(-1);
}
//establish socket name
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path)-1);
unlink(socket_path);
//bind socket
if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
perror("bind error");
exit(-1);
}
//listen to the socket
if (listen(fd, 5) == -1) {
perror("listen error");
exit(-1);
}
while (1) {
//clear the scoket set
FD_ZERO(&readfds);
//add fd socket to set
FD_SET(fd, &readfds);
max_sd = fd;
//add child sockets to the set
for(i = 0; i < 3; i++) {
sd = client_socket[i];
if(sd > 0) {
FD_SET( sd, &readfds);
}
if(sd > max_sd) {
max_sd = sd;
}
}
//wait for an activity from a socket
activity = select(max_sd + 1, &readfds,NULL, NULL,NULL);
if((activity < 0) && (errno!=EINTR)) {
printf("select");
}
if(FD_ISSET(fd, &readfds)) {
if ( (cl = accept(fd, NULL, NULL)) == -1) {
perror("accept error");
continue;
}
while ( (rc=read(cl,buf,sizeof(buf))) > 0) {
printf("read %u bytes: %.*s\n", rc, rc, buf);
}
if (rc == -1) {
perror("read");
exit(-1);
}
else if (rc == 0) {
printf("EOF\n");
close(cl);
}
}
}
return 0;
}
答案 0 :(得分:1)
什么?
DECLARE
treat_rec Hospital.TrtRecTyp;
lv_cnt_num NUMBER(2) := 0;
lv_row_cnt_num NUMBER(2);
BEGIN
i Hospital.BuildPatTbl(treat_rec, lv_cnt_num);
FOR i IN 1..10 LOOP
DBMS_OUTPUT.PUT_LINE('Pat_Nbr = ' || treat_rec.Pat_Nbr);
DBMS_OUTPUT.PUT_LINE('Trt_Procedure = ' || treat_rec.Trt_Procedure);
DBMS_OUTPUT.PUT_LINE('Phys_ID = ' || treat_rec.Phys_ID);
DBMS_OUTPUT.PUT_LINE('Phys_Name = ' || treat_rec.Phys_Name);
DBMS_OUTPUT.PUT_LINE('Phys_Specialty = ' || treat_rec.Phys_Specialty);
END LOOP;
DBMS_OUTPUT.PUT_LINE('The number of rows returned in the table is: ' || lv_cnt_num);
END;
接受连接......
//wait for an activity from a socket
activity = select(max_sd + 1, &readfds,NULL, NULL,NULL);
if((activity < 0) && (errno!=EINTR)) {
printf("select");
}
if(FD_ISSET(fd, &readfds)) {
if ( (cl = accept(fd, NULL, NULL)) == -1) {
阻止读取,直到没有错误...(printf不正确)
perror("accept error");
continue;
}
while ( (rc=read(cl,buf,sizeof(buf))) > 0) {
printf("read %u bytes: %.*s\n", rc, rc, buf);
}
不正确,但假设没有真正的错误意味着阅读直到另一方关闭他们的一方。
考虑到这一点,这应该如何同时支持几个客户?
答案 1 :(得分:0)
我不知道套接字在C中是如何工作的,但我一直在研究一些Java程序,在java中解决问题的方法是在服务器上为每个客户端提供一个单独的线程。每次客户端连接到服务器时,您都会启动一个将为该客户端提供服务的线程。叉子可能会有所帮助。