阅读量:0
c实时通信_通信
(图片来源网络,侵删)1. 概述
实时通信是指通过网络在两个或多个参与者之间即时交换信息的过程,在C语言中,实现实时通信需要使用套接字编程(socket programming)。
2. 套接字编程基础
套接字类型:流套接字(TCP)和数据报套接字(UDP)。
TCP vs UDP:TCP提供可靠的、面向连接的服务;UDP提供不可靠的、无连接的服务。
3. 建立连接
服务器端:创建一个套接字,绑定到特定地址和端口,监听连接请求。
客户端:创建一个套接字,连接到服务器的地址和端口。
4. 数据传输
发送数据:使用send()
函数(TCP)或sendto()
函数(UDP)。
接收数据:使用recv()
函数(TCP)或recvfrom()
函数(UDP)。
5. 错误处理
使用perror()
函数或strerror()
函数输出错误信息。
6. 关闭连接
使用close()
函数关闭套接字。
7. 示例代码
以下是一个基于TCP的简单客户端和服务器示例。
服务器端:
#include <stdio.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> int main() { int server_socket, client_socket; struct sockaddr_in server_address, client_address; char buffer[1024]; server_socket = socket(AF_INET, SOCK_STREAM, 0); server_address.sin_family = AF_INET; server_address.sin_port = htons(8080); server_address.sin_addr.s_addr = INADDR_ANY; bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)); listen(server_socket, 5); printf("Server is listening... "); client_socket = accept(server_socket, (struct sockaddr *)&client_address, (socklen_t*)&sizeof(client_address)); printf("Client connected... "); while (1) { memset(buffer, 0, sizeof(buffer)); read(client_socket, buffer, sizeof(buffer)); printf("Received: %s ", buffer); } close(server_socket); return 0; }
客户端:
#include <stdio.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> int main() { int client_socket; struct sockaddr_in server_address; char buffer[1024]; client_socket = socket(AF_INET, SOCK_STREAM, 0); server_address.sin_family = AF_INET; server_address.sin_port = htons(8080); server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); connect(client_socket, (struct sockaddr *)&server_address, sizeof(server_address)); printf("Connected to server... "); while (1) { fgets(buffer, sizeof(buffer), stdin); send(client_socket, buffer, strlen(buffer), 0); } close(client_socket); return 0; }
8. 注意事项
确保服务器和客户端使用相同的端口号。
在多线程或多进程环境中,注意套接字的共享和同步问题。