在windows系统用C语言完成聊天服务器和客户端的设计,采用网络编程socket的知识,网上有很多源码,帮我弄出最基本的要求就可以了
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,
你这个问题我是第三次看见了,你们都是一个学校的?就不怕重复?