C++ Socket组播服务端与客户端代码
时间: 2023-09-10 07:04:42 浏览: 144
Socket服务端和客户端代码
### 回答1:
好的,下面是关于 C 语言下 Socket 组播服务端与客户端代 码的示例:
服务端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define PORT 8080
#define MAXLINE 1024
int main()
{
int sockfd;
char buffer[MAXLINE];
char* message = "Hello, Multicast!";
struct sockaddr_in servaddr;
// 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
// 绑定套接字
if(bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 循环发送数据
while(1) {
if(sendto(sockfd, (const char*)message, strlen(message), MSG_CONFIRM, (const struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
perror("sendto failed");
exit(EXIT_FAILURE);
}
sleep(1);
}
close(sockfd);
return 0;
}
```
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define PORT 8080
#define MAXLINE 1024
int main()
{
int sockfd;
char buffer[MAXLINE];
struct sockaddr_in servaddr;
// 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("239.0.0.1");
servaddr.sin_port = htons(PORT);
// 加入组播组
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("239.0.0.1");
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
if(setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
perror("setsockopt failed");
exit(EXIT_FAILURE);
}
// 循环接收数据
while(1) {
memset(buffer, 0, MAXLINE);
if(recvfrom(sockfd, (char*)buffer, MAXLINE, MSG_WAITALL, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
perror("recvfrom failed");
exit(EXIT_FAILURE);
}
printf("Message received: %s\n", buffer);
}
close(sockfd);
return 0;
}
```
这段示例代码展示了如何创建基于 UDP 协议的 Socket 组播服务端和客户端,其中服务端会不断向组播地址发送消息,而客户端会监听这个组播地址并接收到服务端发来的消息。
### 回答2:
下面是一个使用Socket进行组播的服务端和客户端的代码示例:
服务端代码:
```python
import socket
# 创建UDP socket,并绑定端口
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('', 5000))
# 加入组播组
group_ip = '239.0.0.1'
group_port = 5555
group = socket.inet_aton(group_ip) + socket.inet_aton('0.0.0.0')
server_socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, group)
while True:
# 接收客户端发送的数据
data, address = server_socket.recvfrom(1024)
# 打印接收到的数据
print(f"接收到来自 {address} 的消息: {data.decode()}")
# 将接收到的数据发送给组播组
server_socket.sendto(data, (group_ip, group_port))
# 关闭socket连接
server_socket.close()
```
客户端代码:
```python
import socket
# 创建UDP socket,并设置套接字为广播类型
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
while True:
# 获取用户输入消息
message = input("请输入要发送的消息(退出请输入q): ")
if message == 'q':
break
# 将消息发送给组播组
client_socket.sendto(message.encode(), ('<broadcast>', 5000))
# 接收服务端发送的数据
data, address = client_socket.recvfrom(1024)
# 打印接收到的数据
print(f"接收到来自 {address} 的回复: {data.decode()}")
# 关闭socket连接
client_socket.close()
```
以上代码中,服务端通过创建一个UDP socket,并绑定指定端口,然后加入指定的组播组。客户端通过创建一个UDP socket并设置为广播类型,然后发送消息给组播组。服务端接收到客户端发送的消息后,将消息发送给组播组,客户端收到组播消息后打印出来。通过这种方式,服务端和客户端可以进行组播通信。
### 回答3:
组播(Multicast)是一种基于UDP的通信协议,它允许一个服务器同时向多个客户端发送数据。下面是Socket组播服务端与客户端的示例代码:
服务端代码:
```python
import socket
def multicast_server():
multicast_group = '224.0.0.1'
server_address = ('', 10000)
# 创建组播套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置套接字为可复用
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定地址和端口
sock.bind(server_address)
# 将套接字加入组播组
group = socket.inet_aton(multicast_group)
mreq = struct.pack('4sL', group, socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True:
data, address = sock.recvfrom(1024)
print(f'Received message: {data.decode()} from {address}')
# 关闭套接字
sock.close()
if __name__ == '__main__':
multicast_server()
```
客户端代码:
```python
import socket
def multicast_client():
multicast_group = '224.0.0.1'
server_address = ('', 10000)
# 创建组播套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置套接字为可复用
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定地址和端口
sock.bind(server_address)
# 将套接字加入组播组
group = socket.inet_aton(multicast_group)
mreq = struct.pack('4sL', group, socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True:
message = input('Enter message to send: ')
# 发送消息到组播组
sock.sendto(message.encode(), (multicast_group, 10000))
# 关闭套接字
sock.close()
if __name__ == '__main__':
multicast_client()
```
以上是一个基本的组播示例,服务端通过创建组播套接字绑定地址和端口,并加入组播组。客户端同样创建组播套接字并加入组播组,然后从用户输入获取消息并发送到组播组。通过组播可以实现向多个客户端同时发送相同的消息。
阅读全文