TCP服务器建立的步骤:
1. 调用socket建立TCP 套接字
2. 调用bind将套接字跟本地地址绑定
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
sockfd参数为调用socket函数后返回的文件描述符。
my_addr参数为指向sockaddr结构体的指针(该结构体中保存有端口和IP地址信息)。
addlen参数为结构体 sockaddr的长度.
错误信息:
EACCES:地址受到保护,用户非超级用户。
EADDRINUSE:指定的地址已经在使用。
EBADF:sockfd参数为非法的文件描述符。
EINVAL:socket已经和地址绑定。
ENOTSOCK:参数sockfd为文件描述符。
3. 调用listen建立监听
int listen(int sockfd, int backlog);
listen函数可使得流套接字sockfd处于监听状态,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个 服务器,并指定相应的套接字变为被动连接。处于监听状态的套接字sockfd将维护一个客户连接请求队列,该队列最多容纳backlog个用户请求。
4. 建立accept接受来自客户端的连接,返回新的连接套接字
int accept(int sockfd, struct sockaddr* addr, socklen_t* len);
accept默认会阻塞进程,直到有一个客户连接建立后返回,它返回的是一个新可用的套接字,这个套接字是连接套接字。
参数sockfd就是上面解释中的监听套接字,这个套接字用来监听一个端口,当有一个客户与服务器连接时,它使用这个一个端口号,而此时这个端口号正与这个套 接字关联。
参数addr 是一个结果参数,它用来接受一个返回值,这返回值指定客户端的地址。可以为NULL
参数len 也是结果的参数,用来接受上述addr的结构的大小的,它指明addr结构所占有的字节个数。可以为NULL
5. 在新的套接字上面,调用send/recv实现跟客户端的通信。
TCP 客户端建立的步骤:
1. 调用socket建立 TCP 套接字
2. 调用connect实现跟服务器端的连接
3. 调用send/recv实现跟服务器端的通信
无论是在服务器端还是客户端,要关闭连接,调用closesocket即可。
1. 调用socket建立TCP 套接字
2. 调用bind将套接字跟本地地址绑定
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
sockfd参数为调用socket函数后返回的文件描述符。
my_addr参数为指向sockaddr结构体的指针(该结构体中保存有端口和IP地址信息)。
addlen参数为结构体 sockaddr的长度.
错误信息:
EACCES:地址受到保护,用户非超级用户。
EADDRINUSE:指定的地址已经在使用。
EBADF:sockfd参数为非法的文件描述符。
EINVAL:socket已经和地址绑定。
ENOTSOCK:参数sockfd为文件描述符。
3. 调用listen建立监听
int listen(int sockfd, int backlog);
listen函数可使得流套接字sockfd处于监听状态,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个 服务器,并指定相应的套接字变为被动连接。处于监听状态的套接字sockfd将维护一个客户连接请求队列,该队列最多容纳backlog个用户请求。
4. 建立accept接受来自客户端的连接,返回新的连接套接字
int accept(int sockfd, struct sockaddr* addr, socklen_t* len);
accept默认会阻塞进程,直到有一个客户连接建立后返回,它返回的是一个新可用的套接字,这个套接字是连接套接字。
参数sockfd就是上面解释中的监听套接字,这个套接字用来监听一个端口,当有一个客户与服务器连接时,它使用这个一个端口号,而此时这个端口号正与这个套 接字关联。
参数addr 是一个结果参数,它用来接受一个返回值,这返回值指定客户端的地址。可以为NULL
参数len 也是结果的参数,用来接受上述addr的结构的大小的,它指明addr结构所占有的字节个数。可以为NULL
5. 在新的套接字上面,调用send/recv实现跟客户端的通信。
TCP 客户端建立的步骤:
1. 调用socket建立 TCP 套接字
2. 调用connect实现跟服务器端的连接
3. 调用send/recv实现跟服务器端的通信
无论是在服务器端还是客户端,要关闭连接,调用closesocket即可。