编写套接字通信程序,实现简单的文字发送、接收形式的会议功能。主持人运行服务器程序,参会者运行客户端程序。主持人发送的文字信息每个客户端用户都可以看到。任一客户端用户发送的文字信息包括主持人在内的其他参会者也都可以看到。服务器或者客户端显示当前开会人数,参会者标识,以及当前发送信息的程序或者用户的标识。c语言实现套接字通信的,在Ubuntu上运行的。终端显示消息。服务器也能像客户一样发信息
时间: 2023-06-27 07:06:13 浏览: 85
这里给出一个简单的基于套接字的会议程序示例,包括服务器和客户端的代码实现。本示例使用C语言编写,可以在Ubuntu上运行。
服务器程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAX_CLIENTS 10
#define BUFFER_SIZE 1024
int main(int argc, char *argv[]) {
int server_sock, client_sock;
struct sockaddr_in server_addr, client_addr;
char buffer[BUFFER_SIZE];
int client_addrs[MAX_CLIENTS];
int num_clients = 0;
int i, j;
// 创建套接字
if ((server_sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// 设置服务器地址和端口
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(8888);
// 绑定套接字到服务器地址和端口
if (bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
// 监听连接请求
if (listen(server_sock, MAX_CLIENTS) == -1) {
perror("listen");
exit(EXIT_FAILURE);
}
printf("Server started, waiting for clients...\n");
while (1) {
// 接受连接
int client_addr_len = sizeof(client_addr);
if ((client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &client_addr_len)) == -1) {
perror("accept");
continue;
}
// 记录客户端信息
client_addrs[num_clients] = client_sock;
num_clients++;
// 发送欢迎信息
sprintf(buffer, "Welcome to the meeting! There are %d participants now.", num_clients);
send(client_sock, buffer, strlen(buffer), 0);
// 接收和转发消息
while (1) {
int bytes_received = recv(client_sock, buffer, BUFFER_SIZE - 1, 0);
if (bytes_received <= 0) {
// 客户端断开连接
printf("Client disconnected\n");
for (i = 0; i < num_clients; i++) {
if (client_addrs[i] == client_sock) {
for (j = i; j < num_clients - 1; j++) {
client_addrs[j] = client_addrs[j + 1];
}
num_clients--;
break;
}
}
sprintf(buffer, "Client %d left the meeting. There are %d participants now.", client_sock, num_clients);
for (i = 0; i < num_clients; i++) {
send(client_addrs[i], buffer, strlen(buffer), 0);
}
break;
} else {
buffer[bytes_received] = '\0';
sprintf(buffer, "Client %d: %s", client_sock, buffer);
for (i = 0; i < num_clients; i++) {
send(client_addrs[i], buffer, strlen(buffer), 0);
}
}
}
close(client_sock);
}
close(server_sock);
return 0;
}
```
客户端程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define BUFFER_SIZE 1024
int main(int argc, char *argv[]) {
int sock;
struct sockaddr_in server_addr;
char buffer[BUFFER_SIZE];
char username[20];
if (argc != 2) {
printf("Usage: %s server_ip\n", argv[0]);
exit(EXIT_FAILURE);
}
// 创建套接字
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// 设置服务器地址和端口
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
server_addr.sin_port = htons(8888);
// 连接服务器
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("connect");
exit(EXIT_FAILURE);
}
// 接收欢迎信息
if (recv(sock, buffer, BUFFER_SIZE - 1, 0) == -1) {
perror("recv");
exit(EXIT_FAILURE);
}
printf("%s\n", buffer);
// 输入用户名
printf("Please enter your username: ");
fgets(username, 20, stdin);
username[strlen(username) - 1] = '\0';
while (1) {
// 输入消息
printf("[%s]: ", username);
fgets(buffer, BUFFER_SIZE, stdin);
buffer[strlen(buffer) - 1] = '\0';
// 发送消息
if (send(sock, buffer, strlen(buffer), 0) == -1) {
perror("send");
exit(EXIT_FAILURE);
}
// 接收消息
if (recv(sock, buffer, BUFFER_SIZE - 1, 0) == -1) {
perror("recv");
exit(EXIT_FAILURE);
}
printf("%s\n", buffer);
}
close(sock);
return 0;
}
```
使用方法:
1. 在Ubuntu上分别编译服务器程序和客户端程序,得到可执行文件。
2. 在一台计算机上运行服务器程序。
3. 在另一台计算机上运行客户端程序,输入服务器的IP地址。
4. 输入用户名,开始会议。
5. 输入消息,发送给其他参会者。收到其他参会者的消息时,会在终端显示。
注意事项:
1. 需要在不同的计算机上运行服务器和客户端程序,才能进行会议。
2. 本示例没有考虑输入错误和异常情况,仅作为演示用途。实际使用时需要进行完善。
阅读全文