在C

时间:2017-05-22 17:06:25

标签: c linux sockets fork

如何在一个客户端会话中键入内容,然后在所有其他客户端中显示?我在C中使用fork进行多客户端聊天服务。到目前为止,我的程序运行良好;我可以输入一个客户端,然后将消息发送到服务器,但我不知道服务器如何将此消息发送回其他子客户端。有什么想法吗?

完整服务器代码:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h> //gia to exit()

int main()
{
int welcomeSocket, newSocket;
char buffer[1024];
char name[32];

struct sockaddr_in serverAddr;
struct sockaddr_storage serverStorage;
socklen_t addr_size;

welcomeSocket = socket(PF_INET, SOCK_STREAM, 0);

serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(7891);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);

bind(welcomeSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));

if (listen(welcomeSocket, 5) == 0)
    printf("Listening\n");
else
    printf("Error\n");

addr_size = sizeof serverStorage;

while (1) {
    newSocket = accept(welcomeSocket, (struct sockaddr*)&serverStorage, &addr_size);
    if (newSocket < 0) {
        perror("Socket");
        continue;
    }
    int pid = fork();
    if (pid < 0) {
        perror("Could not fork");
        exit(1);
    }
    if (pid == 0) {
        // This is the child process
        close(welcomeSocket);

        recv(newSocket, name, sizeof(name), 0);
        int i = 0;

        while (1) {

            recv(newSocket, buffer, sizeof(buffer), 0);
            if (strcmp(buffer, "exit\n") == 0) {
                printf("%s logout\n", name);
                break;
            }
            else if ((strcmp(buffer, "\n") < 0 || strcmp(buffer, "\n") > 0))
                printf("%s:%s", name, buffer);
            else if ((strcmp(buffer, "\n") == 0) && i == 0)
                printf("%s joined\n", name);
        }

        close(newSocket);
        exit(0);
    }
    else {
        // This is the parent

        close(newSocket);
    }
}

close(welcomeSocket);

return 0;
}

完整的客户代码:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>

int main()
{
int clientSocket;
char buffer[1024];
char name[32];
struct sockaddr_in serverAddr;
socklen_t addr_size;

clientSocket = socket(PF_INET, SOCK_STREAM, 0);

serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(7891);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);

addr_size = sizeof serverAddr;
connect(clientSocket, (struct sockaddr*)&serverAddr, addr_size);
printf("Give a username:");
scanf("%s", name);
send(clientSocket, name, sizeof(name), 0);

while (1) {

    fgets(buffer, sizeof(buffer), stdin);
    send(clientSocket, buffer, sizeof(buffer), 0);
    if (strcmp(buffer, "exit\n") == 0)
        break;
}
}

0 个答案:

没有答案