一、封装send函数
size_t socket_send(int sockfd, const char* buffer, size_t len)
{
size_t tmp, total = len;
const char *p = buffer;
while (1)
{
tmp = send(sockfd, p, total, 0);
if (tmp < 0)
{
/*当send收到信号时,可以继续写,但这里返回-1*/
if (errno == EINTR)
{
return -1;
}
/*当socket是非阻塞时,如返回此错误,表示写缓冲队列已满,*/
/*在这里做延时后再重试.*/
if (errno == EAGAIN)
{
usleep(1000);
continue;
}
return -1;
}
if ((size_t)tmp == total)
{
return len;
}
total -= tmp;
p += tmp;
}
return tmp;
}
二、获取客户端连接服务器的socket fd
/*client who want to connect to the server by host and port*/
int getConnectServerSocketfd(const unsigned char *host, const unsigned int port)
{
/*连接socket的ID*/
int sock_fd;
/*根据host获取的主机信息 */
struct hostent* host_info;
/*server socket address*/
struct sockaddr_in sock_addr;
/*//获取主机信息*/
if (NULL == (host_info = gethostbyname(host)))
{
perror("Get host information: fail\n");
return -3;
}
/*创建套接字*/
if (-1 == (sock_fd = socket(AF_INET, SOCK_STREAM, 0)))
{
perror("Create socket: fail\n");
return -2;
}
memset(&sock_addr, 0, sizeof(struct sockaddr_in));
sock_addr.sin_family = AF_INET;
sock_addr.sin_port = htons(port);
//sock_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
memcpy(&sock_addr.sin_addr, host_info->h_addr_list[0], sizeof(host_info->h_addr_list[0]));
/*连接服务器*/
if (-1 == connect(sock_fd, (struct sockaddr *)&sock_addr, sizeof(struct sockaddr)))
{
perror("Connect: fail\n");
return -1;
}
return sock_fd;
}
三、
四、
五、