我正在Linux上用C ++编写一个简单的聊天客户端,以连接到我的计算机上的win32聊天服务器,该服务器也是用C ++编写的。我相信服务器可以工作,但聊天客户端给我带来了一些麻烦。我正在分配聊天客户端,有一个处理传入消息的进程和另一个处理发送消息的进程。我在聊天客户端中使用了两个管道,因此每个进程可以告诉对方何时终止,以便其他进程可以继续并终止。管道似乎没有工作,我不知道我哪里出错了。如果你们可以看看我的代码,我会很感激。也许你们其中一个人会注意到我做得不对劲。这是我的代码:
#define ChildRead pipefd1[0]
#define ChildWrite pipefd2[1]
#define ParentRead pipefd2[0]
#define ParentWrite pipefd1[1]
int main()
{
int nret, theSocket, theMode = 1, pipefd1[2], pipefd2[2];
struct sockaddr_in server;
char buf[2] = {0}, message[999] = {0}, ipAddy[20]= {0}, scrName[20] = {0};
pid_t childpid;
printf("Enter the IP address to connect to.\n\n");
scanf("%s", ipAddy);
printf("\nEnter your screen name.\n\n");
scanf("%s", scrName);
theSocket = socket(AF_INET, SOCK_STREAM, 0);
if(theSocket < 0)
printf("\nCouldn't create socket\n");
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(ipAddy);
server.sin_port = htons(8888);
printf("\nAttempting to connect to %s\n", ipAddy);
nret = connect(theSocket, (struct sockaddr *)&server, sizeof(server));
if(nret < 0)
printf("\nCouldn't connect\n");
ioctl(theSocket, FIONBIO, &theMode);
printf("\nConnected to server!\n\n");
memset(message, 0, strlen(message));
pipe(pipefd1);
pipe(pipefd2);
fcntl(ParentRead, F_SETFL, O_NONBLOCK);
fcntl(ParentWrite, F_SETFL, O_NONBLOCK);
fcntl(ChildRead, F_SETFL, O_NONBLOCK);
fcntl(ChildWrite, F_SETFL, O_NONBLOCK);
childpid = fork();
if(childpid == 0)
{
close(ParentRead);
close(ParentWrite);
while(1)
{
read(ChildRead, &buf, 1);
if(buf[0] == 'q')
{
close(ChildRead);
close(ChildWrite);
close(theSocket);
exit(0);
}
if((nret = recv(theSocket, message, 999, 0)) < 1)
continue;
if(message[7] == '~' && message[8] == 'q')
{
printf("\nChat server disconnected..\n");
write(ChildWrite, "q\0", 1);
close(ChildRead);
close(ChildWrite);
close(theSocket);
exit(0);
}
printf("%s\n", message);
memset(message, 0, strlen(message));
}
}
else
{
strcpy(message, scrName);
strcpy(&message[strlen(message)], ": ");
close(ChildWrite);
close(ChildRead);
while(1)
{
read(ParentRead, &buf, 1);
if(buf[0] == 'q')
{
close(ParentRead);
close(ParentWrite);
close(theSocket);
printf("hmm\n");
exit(0);
}
scanf("%s", &message[strlen(message)]);
if(strcmp(&message[strlen(scrName) + 2], "~q\0") == 0)
{
write(ParentWrite, "q\0", 1);
close(ParentRead);
close(ParentWrite);
close(theSocket);
exit(0);
}
send(theSocket, message, strlen(message), 0);
memset(&message[strlen(scrName) + 2], 0, strlen(&message[strlen(scrName) + 2]));
}
}
return 0;
}