Linux 下的TCP/UDP

来源:互联网 发布:淘宝卖虚拟商品技巧 编辑:程序博客网 时间:2024/06/16 17:22

07年,南京,软件博览会上得到的奖品是LINUX的吉祥物,一只长得像QQ的企鹅。现在来说,如果非要我给LINUX几个形容词的话,我可能会用热情,奔放,开朗,阳光,大度和包容。
ipv4是目前internet所用的网络寻址模式,寻址结构称为sockaddr_in,定义如下:
struct sockaddr_in
{
      sa_family_t      sin_family;            //AF_INET
      unsigned short int     sin_port;            //prot number
      struct      in_addr         sin_addr;       //interent address
}
此结构定义了IPV4的寻址模式—AF_INET,表示是Internet-domainsocket;定义TCP/IPport_number,设置sin_port必须使用htons函数做位排序的操作;sin_addr用一个结构变量定义了IP地址。
In_addr结构定义很简单,包含一个32unsigned integer s_addr变量,用来保存IP地址。
Struct in_addr{
      Unsigned long int  s_addr;
};
在设置IPV4 socket寻址结构时需要用到地址转换函数inet_addr()和位排序函数htons().       Inet_addr()192.168形式的地址转换成s_addr所需的32位无符号整形。
      Struct sockaddr_in adr_srvr;
      Adr_srvr.sin_addr = inet_addr(“192.168.1.10”);
      Adr_srvr.sin_port = htons(8000);

不论是TCP还是IP协议都使用到socket传输数据。相关函数如下:
1.Socket()函数,三个参数,通信协议,链接类型,0
#include <sys/type.h>
#include <sys/socket.h>
int socket (int domain, int type, int protocol)
domain设置为AF_INET,表示使用Internet协议
type为链接类型,SOCK_STREAM,表示使用TCP协议,SOCK-DGRAM表示使用UDP协议。
Protocal通信协议设为0,表示自动选择。
2.bind()三个参数,sockfd,指向 sockaddr_in指针,及其长度
使用bind()函数将ipv4 socket寻址结构绑定到所建立的socket因此每当有数据包到达网络接口时,Linux内核便会将这个数据包导向其所绑定的socket
绑定其实就是定义了socker()的寻址模式,IPport.
#include <sys/socket.h>
int bind (int socfd, const struct sockaddr *my_addr,size_t adr_len)
3.listen()两个参数,socket描述符,侦听的最大数量
listen()函数通知LINUX内核,将socket设为listening socket,等待client端的链接。
#include <sys/socket.h>
int listen (int socfd, int backog)
4.accept() Server端函数,三个参数,sock描述符,存放client端的IP address,及IP address的长度。
server端会将client端的链接请求放入链接队列中,调用accept()函数来处理并接受队列里的链接请求。
#include <sys/socket.h>
int accept (int sockfd, struct sockaddr *addr, socklen_t addrlen)
参数1.      sockfd,socket函数运行后所返回的socket描述符。
        2.addr struct sockaddr_in结构的指针,指向ClientIP地址。
      3.存放 client IP address变量的长度。
5.connect() Client端函数,三个参数,socket描述符,存放server adress,以及socket_in结构的长度。
Client端建立好socket()后,调用connect()向server端请求建立连接,后可以互传数据。
      #include <sys/socker.h>
      int connect (int sockfd, struct sockaddr *serv_addr, int addrlen);
6.close(),一个参数,server端是connect()返回值,client端是sockfd
终止server端和client端的socket链接。
#include <unistd.h>
int close (int sockfd);

78TCP下的输入输出函数
7.read()/write()(成功返回读写位数,错误返回-1
server端建立socket,做好bind()并产生listening socket,接收client端的链接请求server端才可以同client端传递数据,使用输入输出函数,基础函数便是read write.
#include <sys/socket.h>
int read (int sockfd, char *buf, int len);
int write (int sockfd, char *buf, int len);
三个参数:sockfd, buf, len
sockfd: socket函数运行后返回的socket描述符
buf指向字符缓冲器的指针,保存读到和准备写入的数据
len要读取或写入的字符长度。
8.read() write()的变种。
Recv()  he send()
#include <sys/type.h>
#include <sys/socket.h>
      int recv(int s, void *buf, int len , unsigned int flags)
int send(int s, const void *msg, int len, unsigned int flages);

9-10UDP下的输入输出函数。
9.sendto()成功返回传送位数,失败返回-16个参数;
#include <sys/types.h>
#include <sys/socket.h>
int sendto (int s,const void *buf, int len, unsigned flags, const struct sockaddr *to, int tolen);
s:传送数据的socket描述符。
Buf,缓冲器指针,存放要传送的数据
Lensizeofbuf
Flags一般设为0
To,接受端网络地址,
Tolensizeofto)。
10.recvfrom()
参数同sendto(),from为传送端网络地址,fromlensizeoffrom