📄 socket_server.c
字号:
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/time.h>
#include<sys/ioctl.h>
#include<stdio.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
void exec_command(int c_sockfd)
/* exec_command()负责在与服务器连接成功后传送指令并显示结果。 */
{
char buf[256]; /* 用于处理输入的缓冲区 */
int n;
/* 把stdout和stderr重定向到sockfd */
close(1);
dup(c_sockfd);
close(2);
dup(c_sockfd);
n = read(c_sockfd, buf, sizeof(buf));
if (n > 0) {
//printf("%d server %s", n, buf);
system(buf);
}
}
int main()
{
int server_sockfd, client_sockfd;
int client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
//char buf[BUFSIZ];
int result;
fd_set readfds, testfds;
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(19734);
client_len = sizeof(client_address);
bind(server_sockfd, (struct sockaddr *) &server_address, sizeof(server_address));
listen(server_sockfd, 5);
FD_ZERO(&readfds);
FD_SET(server_sockfd, &readfds);
while (1) {
char ch;
int fd;
static int max_fd = 10; /* 为了节省资源,这里最大只使用了10个文件描述符。 */
int n;
testfds = readfds;
printf("server waiting\n");
result = select(max_fd, &testfds, (fd_set *)0, (fd_set *)0, (struct timeval *)0);
if(result < 1) { /* 如果小于1 ,说明select执行出错。 */
perror("server");
exit(1);
}
for(fd = 0; fd < max_fd; fd++) {
if(FD_ISSET(fd, &testfds)) {
//printf("checking%d serverfd%d", fd, server_sockfd);
if(fd == server_sockfd) { /* 如果是来自server,则产生新的连接。 */
client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, &client_len);
FD_SET(client_sockfd, &readfds);
if(client_sockfd > max_fd) max_fd = client_sockfd;
printf("adding client on fd %d\n",client_sockfd);
}
else { /* 检查有没有输入,如果没有,则关闭连接; 如果有,则执行命令。 */
ioctl(fd, FIONREAD, &n);
if(n == 0) {
close(client_sockfd);
FD_CLR(fd, &readfds);
printf("removing client on fd %d\n", fd);
}
else {
exec_command(fd); /* 处理通信的内容 */
//printf("exec_fd:%d\n", fd);
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -