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

Linux 下的TCP/UDP

2010-09-20 15:36 155 查看
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-domain的socket;
定义TCP/IP的port_number,设置sin_port必须使用htons函数做位排序的操作;sin_addr用一个结构变量定义了IP地址。

In_addr
结构定义很简单,包含一个32位unsigned
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()的寻址模式,IP,port.

#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
结构的指针,指向Client
的IP地址。

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);

7—8为TCP下的输入输出函数

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-10为UDP下的输入输出函数。

9.sendto()成功返回传送位数,失败返回-1,6个参数;

#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,缓冲器指针,存放要传送的数据

Len,sizeof(buf)

Flags,一般设为0

To,接受端网络地址,

Tolen,sizeof(to)。

10.recvfrom()

参数同sendto(),from为传送端网络地址,fromlen为sizeof(from)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: