首先,我使用 c++ 编写代码并在 Linux/CentOS 6.4 中运行
因此,经过很长时间并阅读了很多关于套接字的不同书籍后,我终于至少让我的客户端和我的服务器部分工作了。
首先我想不断地接受来自不同客户端的消息,我已经设置了客户端,至少它终于成功编译了。现在我需要设置我的服务器,以便我可以正确测试。
我正在做的是用套接字实现哲学家就餐问题,每个客户/哲学家代表一个不同的过程。我将经历整个事情,服务器将跟踪所有内容,例如所有客户端的状态。这太难了,我现在刚刚创建了客户端,只是为了将它们的状态发送到服务器,然后服务器将其打印出来。
我正在考虑放置一个 do/while 循环来持续接受消息,但不确定应该使用什么来停止循环。请注意,我将在我的客户端中设置一个 while 循环,该循环会在经过一段时间后发出停止信号。然后它应该关闭那个特定的客户端。我的发球确实有信号,但我不确定它是否有效。
#include "helper.h"
char buffer[4096];
void sigchld_handler(int signo)
{
while (waitpid(-1, NULL, WNOHANG) > 0);
}
void client(int &newsock, int nread)
{
do
{
int nread = recv(newsock, buffer,sizeof(buffer), 0);
puts(buffer);
}while(nread!=0);
}
int main(int argc, char *argv[])
{
struct sockaddr_in sAddr, cli_addr;
socklen_t client_len;
int listensock;
int newsock;
int result;
int nread=1;
pid_t childid; ;
int status;
if((listensock = socket(AF_INET, SOCK_STREAM, 0))<0)
{
perror("Problem in creating socket");
exit(2);
}
sAddr.sin_family = AF_INET;
sAddr.sin_port = htons(3333);
sAddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(listensock, (struct sockaddr *) &sAddr, sizeof(sAddr));
if (result < 0) {
perror("exserver2");
return 0;
}
result = listen(listensock, 5);
if (result < 0) {
perror("exserver2");
return 0;
}
signal(SIGCHLD, sigchld_handler);
while (1) {
client_len = sizeof(cli_addr);
newsock = accept(listensock,(struct sockaddr *)&cli_addr, &client_len);
if ((childid = fork()) == 0) {
printf("child process %i created.\n", getpid());
close(listensock);
client(newsock, nread);
}
if(status<0)
{
printf("%s\n" "Read error");
exit(1);
}
close(newsock);
}
}