当调用一些socket系统调用(例如send、recv、connect、accept等)时,会出现"socket is not connected"错误信息。这种错误通常是由以下几个原因引起的:
-
socket创建时未绑定地址,而在发送或接收数据时调用了send、recv等函数。
-
socket断开连接,但未使用shutdown函数关闭该socket,再次调用send、recv等函数时会出现错误信息。
-
在socket未连接时调用了connect函数。
解决这些问题可以通过以下几种方式:
- 绑定地址
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
inet_pton(AF_INET, IP, &addr.sin_addr.s_addr);
/*创建套接字, 设置套接字为非阻塞模式*/
socket_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
/*绑定地址到套接字*/
if(bind(socket_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0){
perror("bind error");
return -1;
}
- 关闭socket连接
close(socket_fd);
- 连接socket
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
inet_pton(AF_INET, IP, &addr.sin_addr.s_addr);
/*创建套接字, 设置套接字为非阻塞模式*/
socket_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
/*连接服务器*/
if( connect(socket_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0){
if(errno != EINPROGRESS){
printf("Connect Error: %s\n", strerror(errno));
return -1;
}
/*调用select等待连接结果*/
FD_ZERO(&write_fds);
FD_SET(socket_fd, &write_fds);
if(select(socket_fd + 1, NULL, &write_fds, NULL, NULL) < 0){
printf("Select Error: %s\n", strerror(errno));
return -1;
}
if(!FD_ISSET(socket_fd, &write_fds)){
printf("Connect Error: Timeout\n");
return -1;
}
}
总之,解决"socket is not connected"问题的关键是找到引发问题的原因,然后采取适当的措施。