在windows系统下用C语言完成聊天服务器和客服端

在windows系统用C语言完成聊天服务器和客户端的设计,采用网络编程socket的知识,网上有很多源码,帮我弄出最基本的要求就可以了

img

img

C还是C++?

这个应该能满足要求吧https://blog.csdn.net/newlw/article/details/125167964

下面是一个简单的聊天服务器和客户端的C语言实现,采用了TCP协议和socket编程。
服务器端代码

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <sys/socket.h>  
#include <arpa/inet.h>  
#include <unistd.h>  
  
#define PORT 8080  
  
int main(int argc, char const *argv[]) {  
    int server_fd, new_socket, valread;  
    struct sockaddr_in address;  
    int opt = 1;  
    int addrlen = sizeof(address);  
    char buffer[1024] = {0};  
    char *hello = "Hello from server";  
  
    // 创建socket文件描述符  
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {  
        perror("socket failed");  
        exit(EXIT_FAILURE);  
    }  
  
    // 设置socket选项  
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {  
        perror("setsockopt");  
        exit(EXIT_FAILURE);  
    }  
  
    // 绑定socket到端口  
    address.sin_family = AF_INET;  
    address.sin_addr.s_addr = INADDR_ANY;  
    address.sin_port = htons(PORT);  
  
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {  
        perror("bind failed");  
        exit(EXIT_FAILURE);  
    }  
  
    // 监听socket,等待客户端连接  
    if (listen(server_fd, 3) < 0) {  
        perror("listen");  
        exit(EXIT_FAILURE);  
    }  
  
    // 接受客户端连接并创建新socket  
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {  
        perror("accept");  
        exit(EXIT_FAILURE);  
    }  
  
    // 读取客户端发送的消息并发送回应消息  
    valread = read(new_socket, buffer, 1024);  
    printf("%s\n", buffer);  
    send(new_socket, hello, strlen(hello), 0);  
    printf("Hello message sent\n");  
    return 0;  
}

客户端代码

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <sys/socket.h>  
#include <arpa/inet.h>  
#include <unistd.h>  
  
#define PORT 8080  
  
int main(int argc, char const *argv[]) {  
    int sockfd, valopt;  
    struct sockaddr_in servaddr;  
    char *hello = "Hello from client";  
    char buffer[1024] = {0};  
    int opt = 1;  
    sockfd = socket(AF_INET, SOCK_STREAM, 0);  
    // 设置socket选项,开启TCP粘包毛病优化选项 SO_SNDTOVR  
    valopt = 1;  
    setsockopt(sockfd, SOL_TCP, SO_SNDTOVR, &valopt, sizeof(valopt));  

服务端


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
 #pragma comment(lib, "ws2_32.lib")
 #define MAX_CLIENTS 10
#define BUF_SIZE 1024
 int main()
{
    WSADATA wsaData;
    SOCKET serverSocket, clientSocket;
    struct sockaddr_in serverAddr, clientAddr;
    int clientAddrLen = sizeof(clientAddr);
    char buffer[BUF_SIZE];
    int i, numClients = 0, port = 8080;
     // 初始化Winsock
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        printf("WSAStartup failed.\n");
        return 1;
    }
     // 创建服务器socket
    serverSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (serverSocket == INVALID_SOCKET) {
        printf("Failed to create socket.\n");
        WSACleanup();
        return 1;
    }
     // 设置服务器地址
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(port);
     // 绑定服务器socket到指定地址和端口
    if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        printf("Failed to bind socket.\n");
        closesocket(serverSocket);
        WSACleanup();
        return 1;
    }
     // 开始监听客户端连接请求
    if (listen(serverSocket, MAX_CLIENTS) == SOCKET_ERROR) {
        printf("Failed to listen.\n");
        closesocket(serverSocket);
        WSACleanup();
        return 1;
    }
     printf("Server started on port %d.\n", port);
     // 循环接受客户端连接请求
    while (1) {
        // 接受客户端连接请求
        clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &clientAddrLen);
        if (clientSocket == INVALID_SOCKET) {
            printf("Failed to accept client.\n");
            continue;
        }
         // 打印客户端连接信息
        printf("Client connected: %s:%d\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
         // 发送欢迎消息
        sprintf(buffer, "Welcome to the chat room!\r\n");
        send(clientSocket, buffer, strlen(buffer), 0);
         // 将客户端socket添加到数组中
        numClients++;
        if (numClients > MAX_CLIENTS) {
            printf("Too many clients.\n");
            closesocket(clientSocket);
            continue;
        }
         // 循环接受和发送消息
        while (1) {
            // 接受客户端消息
            memset(buffer, 0, BUF_SIZE);
            if (recv(clientSocket, buffer, BUF_SIZE, 0) == SOCKET_ERROR) {
                printf("Failed to receive message.\n");
                break;
            }
             // 打印客户端消息
            printf("%s:%d says: %s", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), buffer);
             // 将消息发送给其他客户端
            for (i = 0; i < numClients; i++) {
                if (clientSocket != clients[i])
                    send(clients[i], buffer, strlen(buffer), 0);
            }
        }
         // 关闭客户端socket
        closesocket(clientSocket);
        printf("Client disconnected: %s:%d\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
    }
     // 关闭服务器socket
    closesocket(serverSocket);
     // 清理Winsock
    WSACleanup();
     return 0;
}

客户端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
 #pragma comment(lib, "ws2_32.lib")
 #define BUF_SIZE 1024
 int main()
{
    WSADATA wsaData;
    SOCKET clientSocket;
    struct sockaddr_in serverAddr;
    char buffer[BUF_SIZE];
    char serverIp[16];
    int port = 8080;
     // 初始化Winsock
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        printf("WSAStartup failed.\n");
        return 1;
    }
     // 创建客户端socket
    clientSocket = socket(AF_INET,

你这个问题我是第三次看见了,你们都是一个学校的?就不怕重复?