以tcp的服务器端的全链接套接字(accept返回)为例,测试该套接字在阻塞、非阻塞两种模型下,进程调用系统调用(recv)的行为方式。
阻塞I/O模型(默认):接受缓存区没有数据(即内核数据没有准备好),当调用recv时,task在阻塞在此处。
非阻塞I/O模型(fcntl,ioctl设置):接受缓存区没有数据(即内核数据没有准备好),当调用recv时,直接返回errno11,task不会阻塞在此处。
说明:recv等系统调用仅会阻塞当前的线程(task),不会阻塞整个进程,假设该进程下的有其他线程,其他线程正常运行。
客户端正常向服务器建链,正常发包
/*tcp_client*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include "tcp_info.h"
void perr_exit(const char *str)
{
perror(str);
exit(1);
}
int main(int argc, char **argv)
{
int sfd;
struct sockaddr_in serv_addr;
struct sockaddr_in local_addr;
int len,snd_cnt=0;
char send_buf[DATA_LEN_MAX];
sfd = socket(AF_INET, SOCK_STREAM,0);//大于1460tcp会分片发送
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_port = htons(LOCAL_PORT);
inet_pton(AF_INET,argv[1],