c - 套接字服务器如何在c中连接从多个客户端发送的字符串?
问题描述
我正在用 C 语言制作一个带有多个客户端的套接字服务器。
为了处理客户端的访问,在服务器中使用了函数 fork()。
我制作了子进程从客户端接收每个字符串的源代码,父进程将这些字符串连接到一个字符串。
要将字符串发送到父进程,还使用了函数 pipe()。
但是客户端在从服务器发送连接字符串之前关闭了文件描述。
我编写了函数 write 必须在连接字符串后执行的代码。
我怎样才能将所有连接的字符串发送给每个客户?
客户输入了二,三已经关闭。
服务器代码
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#define MAXLINE 1024
#define PORTNUM 3600
int main(int argc, char **argv)
{
int p1[2];
int p2[2];
pipe(p1);
pipe(p2);
int index = 0;
char channel[100];
char full_str[MAXLINE];
char recv[MAXLINE];
int listen_fd, client_fd;
pid_t pid;
socklen_t addrlen;
int readn;
char buf[MAXLINE];
struct sockaddr_in client_addr, server_addr;
if( (listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
return 1;
}
memset((void *)&server_addr, 0x00, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORTNUM);
if(bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) ==-1)
{
perror("bind error");
return 1;
}
if(listen(listen_fd, 5) == -1)
{
perror("listen error");
return 1;
}
signal(SIGCHLD, SIG_IGN);
while(1)
{
addrlen = sizeof(client_addr);
client_fd = accept(listen_fd,
(struct sockaddr *)&client_addr, &addrlen);
if(client_fd == -1)
{
printf("accept error\n");
break;
}
pid = fork();
if(pid == 0)
{
close( listen_fd );
memset(buf, 0x00, MAXLINE);
while((readn = read(client_fd, buf, MAXLINE)) > 0)
{
printf("Read Data %s(%d) : %s", inet_ntoa(client_addr.sin_addr), client_addr.sin_port, buf);
close(p1[0]);
write(p1[1], buf, sizeof(buf)+1);
close(p2[1]);
read(p2[0], recv, MAXLINE);
if(strlen(recv) != 0) {
write(client_fd, buf, strlen(buf));
}
memset(buf, 0x00, MAXLINE);
}
close(client_fd);
return 0;
}
else if( pid > 0) {
close(p1[1])
read(p1[0], channel, 100);
strcat(full_str, channel)
index++;
if(index >= 3) {
close(p2[0]);
write(p2[1], full_str, MAXLINE);
}
close(client_fd);
}
}
return 0;
}
客户代码
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define MAXLINE 1024
int main(int argc, char **argv)
{
struct sockaddr_in serveraddr;
int server_sockfd;
int client_len;
char buf[MAXLINE];
if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("error :");
return 1;
}
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serveraddr.sin_port = htons(3600);
client_len = sizeof(serveraddr);
if (connect(server_sockfd, (struct sockaddr *)&serveraddr, client_len) == -1)
{
perror("connect error :");
return 1;
}
memset(buf, 0x00, MAXLINE);
read(0, buf, MAXLINE);
if (write(server_sockfd, buf, MAXLINE) <= 0) {
perror("write error : ");
return 1;
}
memset(buf, 0x00, MAXLINE);
if (read(server_sockfd, buf, MAXLINE) <= 0)
{
perror("read error : ");
return 1;
}
printf("read : %s", buf);
close(server_sockfd);
return 0;
}
解决方案
推荐阅读
- arrays - 访问对象数组中的特定对象属性时返回对象承诺?(角度 - 离子)
- firebase - 颤振错误:类型“_Uri”不是“字符串”类型的子类型
- python - 在 pandas agg 中的列列表中共享/百分比
- reactjs - 使用 afterFit 函数 Chart.js 3 增加图形和标签之间的空间时出现问题
- php - 仅显示一位用户的帖子
- python - 使用 obd2 elm327 和 pygame 制作数字仪表板,但是当将 obd2 放入代码中时屏幕是黑色的 obd 可以自行工作
- javascript - 调用 resizeImage() 后如何在 transformFile() 中调用“done()”函数?
- c# - 如何在 SQL 表中使用 WHERE 子句在其为空时更新特定行的注释?
- flutter - Flutter/Dart - 在 Listview.Builder 中动态控制 CheckboxListTile
- loops - 使用谷歌应用程序脚本比较 2 个列表并按顺序填充最终列表