原创 TCP\IP和套接口编程

2009-5-27 20:55 2228 5 5 分类: 软件与OS
rar(内有两个服务器、客户端代码参考)
套接口编程基础
在一个程序中使用套接口需要执行4个步骤:
1.分配空间和初始化
2.连接
3.传送数据
4.关闭

分配套接口和初始化
你需要做的第一项工作就是分配套接口。接着你就的到了一个套接口描述符。套接口描述符可以比作文件描述符。只要你有了套接口描述符,就需要把套接口和预定义的名字空间 中的一个面子关联起来。
对于服务器和客户端应用来说,第一部都是一样的。
socket
每一个套接口都是一个数据通信通道。在进程通过套接口建立连接后,它们用套接口描述字来从套接口中读取数据,并向套接口中写入数据。系统调用socket带有以下参数:
int domain        (会常用到AT_INET协议)
int type            (总是会使用SOCK_STREAM类型的套接口)
int protocol        (几乎所用的套接口类型都只有一种协议)
bind
函数bind将一个进程和一个套接口联系起来。函数bind通常用于服务器进程中接入的客户连接建立一个套接口。函数bind的参数如下:
int socket
struct sockaddr *my_addr
int my_addr_length
函数bind的第一个参数是前一个对函数socket的调用中返回的套接口值。第二个参数是结构sockaddr的地址,结构sockaddr是在/usr/include/linux/socket.h中定义的:
struct sockaddr {
     unsigned short sa_family;        //address family, AF_xxx
     char sa_data[14];                //14bytes of protocol address
};
完成连接的系统调用
listen和accept都用于服务器编程。对于客户端应用来说,秩序使用一个用来连接的系统调用。这个调用有个恰当的名字:connect。
listen
当创建了套接口并且使用bind把它和一个进程关联起来以后,服务器类型的进程可以调用listen函数来监听接入的套接口连接。系统调用listen的参数如下:
int socket
int input_queue_size
系统调用listen的第一个参数是前一次调用socket(而且在调用bind之后)返回的整型socket值。第二个参数设置接入队列的大小。服务器进程经常使用系统调用fork创建自身的一个副本处理接入口的套接口调用:如果你期望同时处理许多客户连接,使用这种方法是相当有效的。
accept
当一个接入信号抵达监听套接口,它们会被排入队列直到服务器程序准备好处理它们为止。当服务器处理一个新连接时,它会使用系统调用accept从套接口的队列中检索一个挂起的信号。accept调用会返回一个新的套接口描述符。这个描述符用来进行客户端和服务器端应用的通信。同时,原来的套接口仍旧能够监听新的接入信号。
系统调用accept的参数为:
int socket
struct sockaddr *my_addr
int *my_addr_length
accept的第一个参数是监听套接口的套接口描述符。第二个参数是一个指向数据区的指针,它将会把有关接入连接的信息填入到数据区。地三个参数是一个整型指针,这个整数设置了my_addr 所能容纳的最大字节数。如果accept调用填入my_addr的数据量比最大值小,则my_addr_length的值会变成为实际的数据字节数。
connect
系统调用connect用来把本地套接口与远程服务联系起来。该调用典型的用法是为运行在远程计算机上的一个服务器指定本地主机的信息。connect的参数为:
int socket
struct sockaddr *server_address
int server_address_length
socket的参数由系统函数socket的返回值来定义。
传送数据recv函数用来接受数据。要发送数据,可以使用send函数。
函数recv用来接收已经连接的套接口传来的消息,这个套接口已经通过调用connect和另一个套接口连接起来了。recv的参数为
int socket
void *buf
int buf_len
unsigned int flags
第一个参数定义的套接口必须是已经使用connect连接到一个端口的套接口。第二个参数是指向内存块的指针,此内存块用来存储接收的信息。第三个参数指定所保留的内存块的大小(以8比特的字节为单位)。第四个参数指出了操作标志。
send
系统调用send用来通过套接口向其他程序传递数据。客户端和服务器端都使用函数send:客户端应用程序使用send向远程服务进程传送服务请求,服务器端应用程序使用send向客户端返回数据。函数send带有以下参数:
int socket
const void *message_data
int message_data_length
unsigned int flags
第一个参数仅仅是调用socket时返回的套接口值。第二个参数包含了要传送的数据。第三个参数以8比特字节为单位指定了信息数据的大小。第四个参数在本章的程序中一直为零。

最后,关闭close。




PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条