linux网络设备应用与驱动编程学习笔记(1)——应用编程(套接字)
2011-09-20 16:49
911 查看
想搞清楚一个陌生的东西是怎么一回事,真的不容易!有点像武侠小说中,想炼成绝世武功要闭关修炼一样。
一、socket套接字简介
客户端与服务器都围绕着通信端点的概念,即套接字。使用套接字要将客户和服务器分开来。
一个套接字通过使用socket()函数惟一确定了一个端点。该端点的细节可以进一步由connnect()或bin()函数定义。最终,客户端定义的端点将与服务器定义的端点进行连
接和通信。
使用UDP和TCP时,端点就是本地或远程IP地址与端口的组合。socket广泛用在网络编程中,使用socket有固定的流程。
二、一个简单的使用流程
服务器端
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_un server_address;
struct sockaddr_un client_address;
/* Remove any old socket and create an unnamed socket for the server. */
unlink("server_socket");
server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
/* Name the socket. */
server_address.sun_family = AF_UNIX;
strcpy(server_address.sun_path, "server_socket");
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
/* Create a connection queue and wait for clients. */
listen(server_sockfd, 5);
while(1) {
char ch;
printf("server waiting\n");
/* Accept a connection. */
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd,
(struct sockaddr *)&client_address, &client_len);
/* We can now read/write to client on client_sockfd. */
read(client_sockfd, &ch, 1);
ch++;
write(client_sockfd, &ch, 1);
close(client_sockfd);
}
}
总结:1.调用socket()函数创建未命名套接字
2.初始化sockaddr_un结构来定义自己的地址格式
3.调用blind()将求命名套接字变成命名套接字
4.调用listen()创建一个连接队列等待客户连接
5.调用accept()接受一个连接
6.对客户套接字进行读写操作
7.关闭套接字
客户端
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int sockfd;
int len;
struct sockaddr_un address;
int result;
char ch = 'A';
/* Create a socket for the client. */
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
/* Name the socket, as agreed with the server. */
address.sun_family = AF_UNIX;
strcpy(address.sun_path, "server_socket");
len = sizeof(address);
/* Now connect our socket to the server's socket. */
result = connect(sockfd, (struct sockaddr *)&address, len);
if(result == -1) {
perror("oops: client1");
exit(1);
}
/* We can now read/write via sockfd. */
write(sockfd, &ch, 1);
read(sockfd, &ch, 1);
printf("char from server = %c\n", ch);
close(sockfd);
exit(0);
}
总结:1.调用socket()函数创建未命名套接字
2.初始化sockaddr_un结构来定义自己的地址格式
3.调用connect()连接服务器套接字
4.对客户套接字进行读写操作
5.关闭套接字
三、一些细节
以上程序使用的是文件系统套接字。还有用于tcp/ip网络通信的网络套接字。它们用法类似。
主机字节和网络字节序
unsigned long int htonl(unsigned long int hostlong);
unsigned long int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned long int ntohs(unsigned short int netshort);
获取网络信息
struct hostent *gethostbyaddr(const void *addr,size_t len,int type);
struct hostent *gethostbyname(const char *name);
struct servent *getservbyname(const char *name,const char *proto);
struct servetn *getservbyport(int port,const char *proto);
因特网守护进程xinetd.UNIX系统通常以超级服务器的方式来提供多项网络服务。监听许多端口地址上的连接。当有客户连接到某项服务时,守护程序就运行相应有服务器。这样可以让各项服务器按需启动。
当客户需要发送一个短小的查询请求服务器时,并且期望接收到一个生龙活虎的响应时,我们一般使用udp提供的服务。使用网络套接字编程时不需要调用connect()函数。
其它操作函数
int sendto(int sockfd,void *buffer,size_t len,int flags,struct sockaddr *to ,socklen_t tolen);
int recvfrom(int sockfd,void *buffer,size_t len,int flags,struct sockaddr *from,socklen_t *fromlen);
一、socket套接字简介
客户端与服务器都围绕着通信端点的概念,即套接字。使用套接字要将客户和服务器分开来。
一个套接字通过使用socket()函数惟一确定了一个端点。该端点的细节可以进一步由connnect()或bin()函数定义。最终,客户端定义的端点将与服务器定义的端点进行连
接和通信。
使用UDP和TCP时,端点就是本地或远程IP地址与端口的组合。socket广泛用在网络编程中,使用socket有固定的流程。
二、一个简单的使用流程
服务器端
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_un server_address;
struct sockaddr_un client_address;
/* Remove any old socket and create an unnamed socket for the server. */
unlink("server_socket");
server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
/* Name the socket. */
server_address.sun_family = AF_UNIX;
strcpy(server_address.sun_path, "server_socket");
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
/* Create a connection queue and wait for clients. */
listen(server_sockfd, 5);
while(1) {
char ch;
printf("server waiting\n");
/* Accept a connection. */
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd,
(struct sockaddr *)&client_address, &client_len);
/* We can now read/write to client on client_sockfd. */
read(client_sockfd, &ch, 1);
ch++;
write(client_sockfd, &ch, 1);
close(client_sockfd);
}
}
总结:1.调用socket()函数创建未命名套接字
2.初始化sockaddr_un结构来定义自己的地址格式
3.调用blind()将求命名套接字变成命名套接字
4.调用listen()创建一个连接队列等待客户连接
5.调用accept()接受一个连接
6.对客户套接字进行读写操作
7.关闭套接字
客户端
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int sockfd;
int len;
struct sockaddr_un address;
int result;
char ch = 'A';
/* Create a socket for the client. */
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
/* Name the socket, as agreed with the server. */
address.sun_family = AF_UNIX;
strcpy(address.sun_path, "server_socket");
len = sizeof(address);
/* Now connect our socket to the server's socket. */
result = connect(sockfd, (struct sockaddr *)&address, len);
if(result == -1) {
perror("oops: client1");
exit(1);
}
/* We can now read/write via sockfd. */
write(sockfd, &ch, 1);
read(sockfd, &ch, 1);
printf("char from server = %c\n", ch);
close(sockfd);
exit(0);
}
总结:1.调用socket()函数创建未命名套接字
2.初始化sockaddr_un结构来定义自己的地址格式
3.调用connect()连接服务器套接字
4.对客户套接字进行读写操作
5.关闭套接字
三、一些细节
以上程序使用的是文件系统套接字。还有用于tcp/ip网络通信的网络套接字。它们用法类似。
主机字节和网络字节序
unsigned long int htonl(unsigned long int hostlong);
unsigned long int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned long int ntohs(unsigned short int netshort);
获取网络信息
struct hostent *gethostbyaddr(const void *addr,size_t len,int type);
struct hostent *gethostbyname(const char *name);
struct servent *getservbyname(const char *name,const char *proto);
struct servetn *getservbyport(int port,const char *proto);
因特网守护进程xinetd.UNIX系统通常以超级服务器的方式来提供多项网络服务。监听许多端口地址上的连接。当有客户连接到某项服务时,守护程序就运行相应有服务器。这样可以让各项服务器按需启动。
当客户需要发送一个短小的查询请求服务器时,并且期望接收到一个生龙活虎的响应时,我们一般使用udp提供的服务。使用网络套接字编程时不需要调用connect()函数。
其它操作函数
int sendto(int sockfd,void *buffer,size_t len,int flags,struct sockaddr *to ,socklen_t tolen);
int recvfrom(int sockfd,void *buffer,size_t len,int flags,struct sockaddr *from,socklen_t *fromlen);
相关文章推荐
- linux网络设备应用与驱动编程学习笔记(2)——网络驱动基础
- linux网络设备应用与驱动编程学习4——模板与实例(C)——其它方法
- linux网络设备应用与驱动编程学习3——lpc3250以太网控制器
- linux网络设备应用与驱动编程学习
- linux网络设备应用与驱动编程学习4——模板与实例(A)
- linux网络设备应用与驱动编程学习3——lpc3250以太网控制器
- linux网络设备应用与驱动编程学习4——模板与实例(B)——打开和释放方法
- [Linux网络编程学习笔记]套接字地址结构
- Linux网络设备驱动学习笔记(-)
- Linux程序设计学习笔记----网络通信编程API及其示例应用
- linux C学习第二天之应用编程和网络编程笔记(上)
- [原]Linux网络编程学习笔记
- 嵌入式linux驱动-网络设备驱动笔记
- Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)
- 《Linux 设备驱动 Edition 3》学习笔记
- [Linux网络编程学习笔记]管道的创建和使用
- Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇
- linux网络编程学习笔记之一 -----各种基础知识小结
- linux 学习笔记--字符设备驱动相关数据结构
- GNU/Linux应用程序开发学习笔记(三)套接字编程