您的位置:首页 > 理论基础 > 计算机网络

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: