TCP/IP网络编程:理解网络编程和套接字
TCP/IP网络编程:理解网络编程和套接字
网络编程又叫做套接字编程,是因为在网络编程中依赖使用套接字(socket),网络编程一般是C/S架构,即客户端/服务器模式,在服务器端依赖套接字绑定自身接口,并开启监听客户端连接,然后进行读写操作;客户端则依赖套接字进行接口连接,以进行收发操作。
服务器端
服务器端遵循以下步骤进行搭建
- 创建套接字
- 绑定监听端口
- 开始监听
- 接受连接
- 进行读写操作
- 关闭连接
下面是创建服务器端通讯的实例
//步骤1:创建套接字
int server_sock;
server_sock = socket(PF_INET,SOCK_STREAM,0);
if (server_sock == -1)
{
error_handing("socket() error");
}
//步骤2:绑定监听端口
struct sockaddr_in server_addr;
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(atoi("3333"));
if (bind(server_sock,(struct sockaddr *)&server_addr,sizeof(server_addr)) == -1)
{
error_handing("bind() error");
}
//步骤3:开启监听
if (listen(server_sock,5) == -1)
{
error_handing("listen() error");
}
//步骤4:接受连接
int accept_sock;
struct sockaddr accept_addr;
socklen_t len = sizeof(accept_addr);
accept_sock = accept(server_sock,&accept_addr,&len);
if (accept_sock == -1)
{
error_handing("accept() error");
}
//步骤5:开始通讯
char message[10];
if (read(accept_sock,message,10) == -1)
{
error_handing("read() error");
}
printf("Read message is %s\n",message);
if (write(accept_sock,message,10) == -1)
{
error_handing("write() error");
}
//步骤6:关闭连接
close(accept_sock);
close(server_sock);
客户端
客户端遵循以下步骤进行搭建
- 创建套接字
- 指定端口连接
- 进行通讯
- 关闭连接
下面是创建客户端通讯的实例
//步骤1:创建套接字
int client_sock;
client_sock = socket(PF_INET,SOCK_STREAM,0);
if (client_sock == -1)
{
error_handing("socket() error");
}
//步骤2:连接端口
struct sockaddr_in connect_addr;
connect_addr.sin_family = AF_INET;
connect_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect_addr.sin_port = htons(3333);
if (connect(client_sock,(struct sockaddr *)&connect_addr,sizeof(connect_addr)) == -1)
{
error_handing("connect() error");
}
//步骤3:进行通讯
if (write(client_sock,"nihao",sizeof("nihao")) == -1)
{
error_handing("write() error");
}
char buffer[30];
if (read(client_sock,buffer,30) == -1)
{
error_handing("read() error");
}
printf("Receive message is %s\n",buffer);
//步骤4:关闭连接
close(client_sock);
网络套接字和文件描述符
在Linux环境中,操作网络套接字和文件描述符是一样的,上面实例中使用write()和read()函数操作网络套接字,
用法跟操作文件描述符别无二致,操作系统自动绑定了0、1、2对应I/O描述符的标准输入、标准输出和标准错误