《linux socket 常用函数》由会员分享,可在线阅读,更多相关《linux socket 常用函数(9页珍藏版)》请在金锄头文库上搜索。
1、linux socket 常用函数 收藏 = TCP = TCP_Server socket() bind()listen() accept()write()read()close() 和 shutdown() TCP_Client socket() connect() send() 和 recv() close() 和 shutdown() = UDP = UDP_Server socket()bind()sendto() 和 recvfrom() close() 和 shutdown() UDP_Client socket()sendto() 和 recvfrom() close() 和
2、shutdown() getpeername() gethostname()-socket() 我们使用系统调用 socket()来获得文件描述符:#include#includeint socket(int domain, int type, int protocol); 第一个参数 domain 设置为“AF_INET ”。第二个参数是套接口的类型:SOCK_STREAM 或SOCK_DGRAM。第三个参数设置为 0。系统调用 socket()只返回一个套接口描述符,如果出错,则返回-1。-bind() 一旦你有了一个套接口以后,下一步就是把套接口绑定到本地计算机的某一个端口上。但如果你只
3、想使用 connect()则无此必要。下面是系统调用 bind()的使用方法:#include#includeintbind(int sockfd, struct sockaddr* my_addr, int addrlen); 第一个参数 sockfd 是由 socket()调用返回的套接口文件描述符。第二个参数 my_addr 是指向数据结构 sockaddr 的指针。数据结构 sockaddr 中包括了关于你的地址、端口和 IP 地址的信息。第三个参数 addrlen 可以设置成 sizeof(structsockaddr)。下面是一个例子:view plaincopy to clipb
4、oardprint?#include #include #include #define MYPORT 3490 main() int sockfd; struct sockaddr_in my_addr; sockfd=socket(AF_INET,SOCK_STREAM,0); /*do someerror checking!*/ my_addr.sin_family=AF_INET; /*hostbyteorder*/ my_addr.sin_port=htons(MYPORT); /*short,network byte order*/ my_addr.sin_addr.s_addr=
5、inet_addr(132.241.5.10); bzero( /*zero the rest of the struct*/ /*dont forget your error checking for bind():*/ bind(sockfd,(struct sockaddr*) . #include#include#include#define MYPORT 3490main()int sockfd;struct sockaddr_in my_addr;sockfd=socket(AF_INET,SOCK_STREAM,0); /*do someerror checking!*/my_a
6、ddr.sin_family=AF_INET; /*hostbyteorder*/my_addr.sin_port=htons(MYPORT); /*short,network byte order*/my_addr.sin_addr.s_addr=inet_addr(132.241.5.10);bzero( /*zero the rest of the struct*/*dont forget your error checking for bind():*/bind(sockfd,(struct sockaddr*). 如果出错,bind() 也返回-1 。如果你使用 connect()系
7、统调用,那么你不必知道你使用的端口号。当你调用 connect()时,它检查套接口是否已经绑定,如果没有,它将会分配一个空闲的端口。-connect() 系统调用 connect()的用法如下:#include#includeint connect(int sockfd, struct sockaddr * serv_addr, int addrlen); 第一个参数还是套接口文件描述符,它是由系统调用 socket()返回的。第二个参数是 serv_addr 是指向数据结构 sockaddr 的指针,其中包括目的端口和 IP 地址。第三个参数可以使用 sizeof(structsockadd
8、r)而获得。下面是一个例子:view plaincopy to clipboardprint?#include #include #include #define DEST_IP 132.241.5.10 #define DEST_PORT 23 main() int sockfd; struct sockaddr_in dest_addr; /*will hold the destination addr*/ sockfd=socket(AF_INET, SOCK_STREAM, 0); /*do some error checking!*/ dest_addr.sin_family=AF_
9、INET; /*hostbyteorder*/ dest_addr.sin_port=htons(DEST_PORT); /*short,network byte order*/ dest_addr.sin_addr.s_addr=inet_addr(DEST_IP); bzero( /*zero the rest of the struct*/ /*dontforgettoerrorchecktheconnect()!*/ connect(sockfd,(struct sockaddr *) . #include#include#include#define DEST_IP 132.241.
10、5.10#define DEST_PORT 23main()int sockfd;struct sockaddr_in dest_addr; /*will hold the destination addr*/sockfd=socket(AF_INET, SOCK_STREAM, 0); /*do some error checking!*/dest_addr.sin_family=AF_INET; /*hostbyteorder*/dest_addr.sin_port=htons(DEST_PORT); /*short,network byte order*/dest_addr.sin_ad
11、dr.s_addr=inet_addr(DEST_IP);bzero( /*zero the rest of the struct*/*dontforgettoerrorchecktheconnect()!*/connect(sockfd,(struct sockaddr *). 同样,如果出错,connect()将会返回 -1。-listen() 如果你希望不连接到远程的主机,也就是说你希望等待一个进入的连接请求,然后再处理它们。这样,你通过首先调用 listen(),然后再调用 accept()来实现。系统调用 listen()的形式如下:intl isten(int sockfd, in
12、t backlog); 第一个参数是系统调用 socket()返回的套接口文件描述符。第二个参数是进入队列中允许的连接的个数。进入的连接请求在使用系统调用 accept()应答之前要在进入队列中等待。这个值是队列中最多可以拥有的请求的个数。大多数系统的缺省设置为 20。你可以设置为 5 或者 10。当出错时,listen()将会返回-1 值。当然,在使用系统调用 listen()之前,我们需要调用 bind()绑定到需要的端口,否则系统内核将会让我们监听一个随机的端口。所以,如果你希望监听一个端口,下面是应该使用的系统调用的顺序:socket();bind();listen();/*accep
13、t()goeshere*/ -accept() 系统调用 accept()比较起来有点复杂。在远程的主机可能试图使用 connect()连接你使用listen()正在监听的端口。但此连接将会在队列中等待,直到使用 accept()处理它。调用accept()之后,将会返回一个全新的套接口文件描述符来处理这个单个的连接。这样,对于同一个连接来说,你就有了两个文件描述符。原先的一个文件描述符正在监听你指定的端口,新的文件描述符可以用来调用 send()和 recv()。调用的例子如下:#includeintaccept(int sockfd, void *addr, int *addrlen);
14、第一个参数是正在监听端口的套接口文件描述符。第二个参数 addr 是指向本地的数据结构sockaddr_in 的指针。调用 connect()中的信息将存储在这里。通过它你可以了解哪个主机在哪个端口呼叫你。第三个参数同样可以使用 sizeof(structsockaddr_in)来获得。如果出错,accept()也将返回-1。下面是一个简单的例子:view plaincopy to clipboardprint?#include #include #include #define MYPORT 3490 /*theportuserswillbeconnectingto*/ #define BACKLOG 10 /*howmanypendingconnectionsqueuewillhold*/ main() int sockfd, new_fd; /*listenonsock_fd,newconnectio