本书为学习C语言Socket编程的读者提供了一站式的解决方案,通过丰富的实例指导读者直接进行编译和运行实践,帮助初学者快速掌握网络通信编程技巧。
本段落介绍最新版的Socket编程,并附带实例代码供直接编译运行参考。文中设计了服务端与客户端的Socket示例,并提供了IPv4和IPv6的相关实现代码。
网络中的Socket数据传输被视为一种特殊的I/O操作,而Socket本身也是一种文件描述符。创建一个新的连接时会调用一个类似打开文件的操作函数socket(),此函数返回一个整数型的Socket描述符,随后的所有通信都将通过这个Socket进行。
以下是服务器端的部分示例代码:
```c
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVPORT 3333 /*服务器监听端口号 */
#define BACKLOG 10 /* 最大同时连接请求数 */
int main() {
int sockfd, client_fd; // sockfd:用于监听的Socket;client_fd:数据传输用Socket
struct sockaddr_in my_addr, remote_addr; // 分别存储本机地址信息和客户端地址信息
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror(socket创建出错!);
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT); // 设置端口号
my_addr.sin_addr.s_addr = INADDR_ANY; // 允许所有IP地址连接到此Socket
bzero(&(my_addr.sin_zero), 8);
if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) == -1) {
perror(bind出错!);
exit(1);
}
if (listen(sockfd, BACKLOG) == -1) {
perror(listen出错!);
exit(1);
}
while(1){
socklen_t sin_size = sizeof(struct sockaddr_in); // 客户端地址信息大小
if ((client_fd = accept(sockfd, (struct sockaddr *) &remote_addr, &sin_size)) == -1) {
perror(accept出错);
continue;
}
printf(received a connection from %s\n, inet_ntoa(remote_addr.sin_addr));
// 子进程处理客户端请求
if (!fork()) {
if (send(client_fd, Hello, you are connected!\n, 26, 0) == -1)
perror(send出错!);
close(client_fd);
exit(0);
}
close(client_fd);
}
}
```
该代码展示了如何使用socket函数创建服务器端监听Socket,进行绑定和监听操作,并处理客户端的连接请求。