概述网络编程是现代软件开发中不可或缺的一部分,而C语言因其高效性和底层控制能力,成为实现网络通信的理想选择。本文将深入探讨C语言TCP编程,揭示网络通信的底层奥秘。套接字编程基础1. 套接字的定义与创...
网络编程是现代软件开发中不可或缺的一部分,而C语言因其高效性和底层控制能力,成为实现网络通信的理想选择。本文将深入探讨C语言TCP编程,揭示网络通信的底层奥秘。
在C语言中,通过socket函数创建一个套接字:
#include
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) { perror("socket creation failed"); exit(EXIT_FAILURE);
} 这里,AF_INET代表IPv4地址家族,SOCK_STREAM表示TCP协议。
服务器端需要绑定一个特定的IP地址和端口号:
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(PORT);
if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("bind failed"); exit(EXIT_FAILURE);
}在服务器和客户端分别创建套接字。
为服务器和客户端设置IP地址和端口号。
服务器端绑定IP地址和端口号,客户端不需要绑定。
服务器端调用listen函数开始监听连接请求。
服务器端使用accept函数接受客户端的连接请求。
使用send和recv函数发送和接收数据。
通信结束后,使用close函数关闭套接字。
以下是一个简单的TCP服务器和客户端的代码示例:
服务器端代码(tcpSer.c):
#include
#include
#include
#include
#include
#define SER_PORT 3333
#define SER_IP "192.168.1.100"
int main() { int sfd, newfd; struct sockaddr_in servaddr, cliaddr; socklen_t cli_len = sizeof(cliaddr); sfd = socket(AF_INET, SOCK_STREAM, 0); if (sfd < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = inet_addr(SER_IP); servaddr.sin_port = htons(SER_PORT); if (bind(sfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } if (listen(sfd, 3) < 0) { perror("listen failed"); exit(EXIT_FAILURE); } while (1) { newfd = accept(sfd, (struct sockaddr *)&cliaddr, &cli_len); if (newfd < 0) { perror("accept failed"); continue; } char buffer[1024]; read(newfd, buffer, 1024); printf("Received: %s\n", buffer); write(newfd, "Hello from server!", 24); close(newfd); } close(sfd); return 0;
} 客户端代码(tcpCli.c):
#include
#include
#include
#include
#include
#define SER_IP "192.168.1.100"
#define SER_PORT 3333
int main() { int sfd; struct sockaddr_in servaddr; sfd = socket(AF_INET, SOCK_STREAM, 0); if (sfd < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = inet_addr(SER_IP); servaddr.sin_port = htons(SER_PORT); if (connect(sfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("connect failed"); exit(EXIT_FAILURE); } char buffer[1024]; printf("Enter message: "); fgets(buffer, 1024, stdin); write(sfd, buffer, strlen(buffer)); read(sfd, buffer, 1024); printf("Server response: %s\n", buffer); close(sfd); return 0;
} 通过以上内容,我们可以了解到C语言TCP编程的基本概念、步骤和代码示例。掌握这些知识将有助于我们更好地理解和实现网络通信的底层奥秘。