c 网络编程实例教程
- 行业动态
- 2025-02-14
- 3007
一、创建套接字
1、套接字类型:主要有两种类型,流套接字(SOCK_STREAM)用于TCP连接,数据报套接字(SOCK_DGRAM)用于UDP连接。
2、创建函数:在C语言中,使用socket()
函数创建套接字,其原型为int socket(int domain, int type, int protocol);
,创建一个IPv4的流套接字可以使用socket(AF_INET, SOCK_STREAM, 0);
。
3、示例代码:
int sockfd;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) { perror("Error opening socket"); exit(1); }
二、绑定地址
1、bind()函数:用于将套接字与特定的IP地址和端口号绑定在一起,其原型为int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
。
2、sockaddr_in结构:对于IPv4,使用sockaddr_in
结构来指定地址和端口,该结构包含以下成员:sin_family
(地址族,通常为AF_INET)、sin_port
(端口号,需要使用htons()
函数转换为网络字节序)、sin_addr
(IP地址,使用INADDR_ANY
表示任意本地地址或使用inet_addr()
函数设置具体IP地址)。
3、示例代码:
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(8080);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { perror("Error on binding"); exit(1); }
三、监听和接受连接
1、listen()函数:将套接字设置为监听模式,准备接受客户端的连接请求,其原型为int listen(int sockfd, int backlog);
,其中backlog
参数指定等待连接队列的最大长度。
2、accept()函数:用于接受连接请求,其原型为int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
,当有客户端连接时,accept()
函数会返回一个新的套接字描述符,用于与该客户端进行通信。
3、示例代码:
listen(sockfd, 5);
struct sockaddr_in cli_addr;
socklen_t clilen = sizeof(cli_addr);
int newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0) { perror("Error on accept"); exit(1); }
四、发送和接收数据
1、send()函数:用于向已连接的客户端发送数据,其原型为ssize_t send(int sockfd, const void *buf, size_t len, int flags);
,其中buf
是要发送的数据缓冲区,len
是要发送的数据长度,flags
通常设为0。
2、recv()函数:用于从已连接的客户端接收数据,其原型为ssize_t recv(int sockfd, void *buf, size_t len, int flags);
,其中buf
是存储接收数据的缓冲区,len
是缓冲区长度,flags
通常设为0。
3、示例代码:
char buffer[256];
bzero(buffer, 256);
int n = recv(newsockfd, buffer, 255, 0);
if (n < 0) { perror("Error reading from socket"); exit(1); }
`printf("Here is the message: %s
", buffer);`
n = send(newsockfd, "I got your message", 18, 0);
if (n < 0) { perror("Error writing to socket"); exit(1); }
五、关闭套接字
1、close()函数:用于关闭套接字,释放资源,其原型为int close(int sockfd);
。
2、示例代码:
close(newsockfd);
close(sockfd);
通过以上步骤和示例代码,可以初步掌握C语言网络编程的基本流程和方法,在实际开发中,还需要根据具体需求进行进一步的优化和完善,例如处理并发连接、实现协议解析等。