基于c语言使用socket编程实现双人聊天室
时间: 2023-08-01 19:14:06 浏览: 172
实现双人聊天室需要使用socket编程中的TCP协议。以下是一个简单的c语言程序,实现了基本的双人聊天室功能。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 8888 // 聊天室端口号
int main(int argc, char *argv[]) {
int fd, ret;
struct sockaddr_in server_addr, client_addr;
socklen_t client_addr_size = sizeof(client_addr);
// 创建socket
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// 设置服务端地址
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT);
// 绑定socket到地址
ret = bind(fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (ret == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
// 监听socket
ret = listen(fd, 1); // 同时只能连接一个客户端
if (ret == -1) {
perror("listen");
exit(EXIT_FAILURE);
}
printf("Waiting for connection...\n");
// 接受客户端连接
int client_fd = accept(fd, (struct sockaddr *)&client_addr, &client_addr_size);
if (client_fd == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
printf("Connected!\n");
// 开始聊天
char buf[1024];
while (1) {
// 接收客户端消息
ret = recv(client_fd, buf, sizeof(buf), 0);
if (ret == -1) {
perror("recv");
exit(EXIT_FAILURE);
} else if (ret == 0) {
printf("Client disconnected.\n");
break;
} else {
printf("Received: %s", buf);
}
// 发送消息给客户端
printf("Say something: ");
fgets(buf, sizeof(buf), stdin);
ret = send(client_fd, buf, strlen(buf), 0);
if (ret == -1) {
perror("send");
exit(EXIT_FAILURE);
}
}
// 关闭socket
close(client_fd);
close(fd);
return 0;
}
```
运行该程序后,服务端将等待客户端连接。当客户端连接成功后,服务端和客户端就可以开始聊天了。
客户端程序也非常简单,只需要连接到服务端并发送和接收消息即可。以下是客户端程序的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERVER_IP "127.0.0.1" // 服务端IP地址
#define PORT 8888 // 聊天室端口号
int main(int argc, char *argv[]) {
int fd, ret;
struct sockaddr_in server_addr;
// 创建socket
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// 设置服务端地址
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
server_addr.sin_port = htons(PORT);
// 连接到服务端
ret = connect(fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (ret == -1) {
perror("connect");
exit(EXIT_FAILURE);
}
// 开始聊天
char buf[1024];
while (1) {
// 发送消息给服务端
printf("Say something: ");
fgets(buf, sizeof(buf), stdin);
ret = send(fd, buf, strlen(buf), 0);
if (ret == -1) {
perror("send");
exit(EXIT_FAILURE);
}
// 接收服务端消息
ret = recv(fd, buf, sizeof(buf), 0);
if (ret == -1) {
perror("recv");
exit(EXIT_FAILURE);
} else if (ret == 0) {
printf("Server disconnected.\n");
break;
} else {
printf("Received: %s", buf);
}
}
// 关闭socket
close(fd);
return 0;
}
```
运行服务端程序后,再运行两个客户端程序,就可以在各个客户端之间进行聊天了。
阅读全文