首先,了解Socket编程的基本概念是十分必要的,Socket(套接字)是应用层和传输层之间的接口, 一般把Socket称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。在Linux下进行Socket编程的时候,需要调用一些相关的头文件和库文件。本攻略将详细讲解Linux下Socket编程中常用的头文件。
1.
该头文件提供了许多与Socket相关的系统调用函数和数据结构,包括:socket()、bind()、listen()、accept()、connect()、send()、recv()等。
2.
该头文件定义了网络地址(如IP地址)和端口号的结构体,包括:in_addr、in_port_t、sockaddr_in等。
3.
该头文件提供了一些用于将网络地址表示的字符串与网络字节序之间进行转换的函数,包括:inet_addr()、inet_ntoa()、inet_aton()、inet_pton()、inet_ntop()等。
4.
该头文件提供了用于域名解析和网络数据转换的函数,包括:gethostbyname()、gethostbyaddr()、getservbyname()、htons()、ntohs()、htonl()、ntohl()等。
下面通过两个示例来说明如何使用这些头文件:
示例一:Server端监听客户端连接
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char* argv[])
{
struct sockaddr_in srv_addr;
struct sockaddr_in cli_addr;
int sockfd, cli_sockfd;
socklen_t cli_len;
char buf[1024];
// 创建Socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("socket() error.\n");
return -1;
}
memset(&srv_addr, 0, sizeof(srv_addr));
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(8888);
srv_addr.sin_addr.s_addr = INADDR_ANY;
// 绑定Socket
if(bind(sockfd, (struct sockaddr*)&srv_addr, sizeof(srv_addr)) < 0);
{
perror("bind() error.\n");
return -1;
}
// 监听Socket
if(listen(sockfd, 5) < 0)
{
perror("listen() error.\n")
return -1;
}
printf("Server is listening...\n");
// 等待客户端连接
cli_sockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &cli_len);
if(cli_sockfd < 0)
{
perror("accept() error.\n")
return -1;
}
// 接收客户端发来的消息
memset(buf, 0, sizeof(buf));
if(recv(cli_sockfd, buf, sizeof(buf), 0) < 0)
{
perror("recv() error.\n")
return -1;
}
printf("Received message from client: %s\n", buf);
// 关闭Socket
close(cli_sockfd);
close(sockfd);
return 0;
}
示例二:Client端连接服务器并发送数据
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char* argv[])
{
struct sockaddr_in srv_addr;
int sockfd;
char buf[] = "Hello, Server.";
// 创建Socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("socket() error.\n");
return -1;
}
memset(&srv_addr, 0, sizeof(srv_addr));
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(8888);
srv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
// 连接服务器
if(connect(sockfd, (struct sockaddr*)&srv_addr, sizeof(srv_addr)) < 0)
{
perror("connect() error.\n");
return -1;
}
// 发送数据到服务器
if(send(sockfd, buf, sizeof(buf), 0) < 0)
{
perror("send() error.\n")
return -1;
}
// 关闭Socket
close(sockfd);
return 0;
}
上述两个例子演示了基本的Socket编程,从创建Socket到绑定/连接服务器得到套接字描述符,再通过accept()/send()/recv()等函数进行接收和发送数据。可以看出,这些头文件是非常重要的,可以方便简洁地实现Socket编程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:linux下socket编程常用头文件(推荐) - Python技术站