- socket可以看成是一种特殊的文件,所以可以通用“open--read/write--close”模式来操作。
- socket()函数对应于普通的open()函数,用于创建一个socket。原型 intsocket(int domain, int type, int protocol);
- domain : 协议域/协议族(family)
- type:指定socket类型
- protocol :指定协议,一般默认为0,默认使用与type对应的协议
- bind()函数:把一个特定的地址赋给socket,即把"IP地址+端口号"与socket绑定。原型 int bind(int sockfd, conststruct sockaddr *addr, socklen_t addrlen);
- sockfd :要绑定的socket
- addr :地址结构体。在IPV4中它的类型是:sockaddr_in ,包含协议族(指定地址类型)、端口号、IP地址。
- addrlen :对应的IP地址的长度。
- 服务器bind()的addr,要bind服务器的IP地址,一般使用127.0.0.1可以,但是如果服务器有多块网卡(多个IP),最好还是使用seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//INADDR_ANY指任意IP
-
listen()、connect()函数
-
int listen(int sockfd, int backlog); int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- 服务器端在调用了socket()和bind()函数之后,调用listen()函数来监听socket。然后客户端调用connect()函数的时候,服务器端就能收到连接请求(服务器端调用accept()函数处理请求)。
- listen()函数的第一个参数即为要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。
- connect()函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。
-
- accept()函数:服务器端调用来接收客户端的连接请求
-
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
- 第一个参数是服务器的套接字地址,第二个参数返回客户端的协议地址,第三个是客户端协议地址的长度。
- accept()函数返回的是一个全新的socket,代表与返回客户端的TCP连接。
- 注意:accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,称为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器通常通常仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。
-
- read()、write()等 函数:连接建立完成之后,进行网络I/O操作。
- 常用的操作函数
- read()/write():参考 http://blog.csdn.net/linux_wgl/article/details/7856090
- recv()/send():参考 http://blog.csdn.net/xiaofei0859/article/details/6037814
- readv()/writev():以向量vector的形式传递数据
- recvmsg()/sendmsg():unix中用这个比较多,参考http://blog.csdn.net/sunnyboychina/article/details/1897446
- recvfrom()/sendto():UPD用,TCP不用这个。
- 原型可以查,推荐recvmsg()和sendmsg()
- 常用的操作函数
- close()函数:读写操作完成之后关闭相应的socket描述字。对应文件操作的fclose操作。
- 原型: int close(int fd); fd为要关闭的套接字。
- close一个TCP scoket的缺省行为是把该socket标记为关闭,然后立即返回调用进程,然后该套接字就不能再被进程调用了,也就是说不能在作为write或者read函数的第一个参数。
- close操作只是使相应的socket描述字的引用计数-1,只有当引用计数为0时,才会触发TCP客户端向服务器发送中止连接请求。
- 声明:本文摘录自Linux Socket编程(不限Linux),感谢原作者。
- 另可参考 基于TCP的Socket 编程