socket
网络通信需要使用到socket,它是一种“打开-读/写-关闭”的模式实现。
1.连接
int build_connect(int *fd, char *ip, int port) { struct sockaddr_in server_addr; bzero(&server_addr, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_port = htos(port); if(!inet_aton(ip, &server_addr.sin_addr)) { return -1; } if((*fd = socket(PF_INET, SOCK_STREAM,0))<0) { return -1; } if(connect(*fd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in))<0) { close(*fd); return -1; } return 0; }
sockaddr_in结构体的原型是:
struct sockaddr_in { __SOCKADDR_COMMAN(sin_); in_port_t sin_port; struct in_addr sin_addr; unsigned char sin_zero[sizeof(struct sockaddr) - __SOCKADDR_COMMAN_SIZE - sizeof(in_port_t) - sizeof(struct in_addr)]; }
2.设置阻塞方式
void set_nonblocking(int fd) { int flag; if(flag = fcntl(fd, F_GETTL) < 0) { LOG(LOG_LEVEL_ERROR, "fcntl getfl fail"); } flag |= O_NONBLOCK; if((flag = fcntl(fd, F_SETFL, flag))<0) { LOG(LOG_LEVEL_ERROR, "fcntl setfl fail"); } }