Linux 套接字编程-基础总结

这两天一直在看《linux C编程实战》网路编程一章,主要研究的是套接字编程这部分。里面的大部分程序自己都上机验证了。最后的一个综合应用,服务器/客户端 程序自己也是亲自敲进电脑的。也许敲的过程就是一种学习,可以发现里面一些细节上的问题,这是光看发现不了的。根据这本书的讲解,再依据对最后这个应用程序的理解,自己把套接字编程的需要注意的地方总结下。


套接字地址结构

结构struct sockaddr 定义了一种通用的套接字地址,它的类型是:

struct sockaddr

{

    unsigned short sa_family;      //地址类型,一般为AF_INET

    char           sa_data[14];    //14字节的协议地址

};

这是一种通用的定义,一般都不用。TCP/IP使用的是自己的结构体struct sockaddr_in,格式如下:

struct sockaddr_in

{

    unsigned short sin_family;      //地址类型,一般为AF_INET

    unsigned short sin_port;        //端口号

    struct in_addr sin_addr;        //IP地址

    unsigned char  sin_zero[8];     //填充字节,一般赋值为0。为了使结构体长度达到16字节,匹配结构体sockaddr

};

这里的struct in_addr的定义如下:

struct in_addr

{

    unsigned long  s_addr;

};

结构体sockaddr和sockaddr_in的长度都是16字节。一般在编TCP/IP程序时,一般使用结构体sockaddr_in来设置地址,然后在需要的时候,通过强制类型转换成sockaddr类型。

 

创建套接字

socket函数用来创建一个套接字,函数原型:

int socket(int domain, int type, int protocol);

参数domain指定创建套接字所使用的协议族;

参数type指定套接字的类型;

参数protocol通常设置为0。

函数执行成功,返回一个新创建的套接字,错误返回-1。


 

建立连接

函数connect用来在一个指定的套接字上创建一个连接,函数原型:

int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);

参数sockfd是一个由函数socket创建的套接字;

参数serv_addr是一个地址结构,需要连接的地址;

参数addrlen为参数addr_addr的长度。

函数执行成功返回0,有错误发生则返回-1。

如果套接字类型是TCP,则该函数用于向服务器发出连接请求,服务器的IP地址和端口号由参数serv_addr指定;如果套接字类型是UDP,则该函数并不建立真正的连接,它只是告诉内核与该套接字进行通信的目的地址(由第二个参数指定),只有该目的地址发来的数据才会被该socket接收。

通常一个面向连接的套接字只能调用一次connect函数;而对于无连接的套接字则可以多次调用connect函数以改变与目的地址的绑定。

 

在套接字上监听

函数listen把套接字转化为被动监听,函数原型:

int listen(int s, int backlog);

参数s指定了一个套接字;

参数backlog指定了该连接队列的最大长度,如果已达到最大,则之后的连接请求将被服务器拒绝。

函数执行成功赶回0,有错误发生则返回-1。

由函数socket创建的套接字是主动套接字,这种套接字可以用来主动请求连接到某个服务器上。(通过connect()函数)。

作为服务器端的程序,通常在某个端口上监听等待来自客户端的连接请求。在服务器端,一般是先调用函数socket创建一个主动套接字,然后调用函数bind将该套接字绑定到某个端口上,接着再调用函数listen将该套接字转化为监听套接字,等待来自于客户端的连接请求。

函数listen只是将套接字设置为倾听模式以等待连接请求,它并不能接收连接请求,真正的接收客户端连接请求的是accept()函数。

 

接收连接

函数accept用来接收一个连接请求,函数原型:

int accept(int s, struct sockaddr *addr, socklen_t *addrlen);

参数s是由socket创建,经函数bind绑定到本地某一端口上,然后通过函数listen转化而来的监听套接字;

参数addr用来保存发起连接请求的主机的地址和端口;

参数addrlen是addr所指向的结构体的大小。

函数执行成功返回一个新的代表客户端的套接字,出错则返回-1。

只能对面向连接的套接字使用accept函数。accept执行成功时,将创建一个新的套接字,并且这个新的套接字分配一个套接字描述符,并返回这个新的套接字描述符。这个新的套接字描述符与打开文件返回的文件描述符类似,进程可以利用这个新的套接字描述符与客户端交换数据,参数s所指定的套接字继续等待客户端的连接请求。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值