【发布时间】:2018-01-18 15:04:08
【问题描述】:
我在尝试创建以下代码的函数时遇到问题,因此我可以重用它来轻松创建新套接字:
if ( (socket_fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0 ) /* return 1 if okay */
{
printf("ERROR opening socket ... 1");
}
serv_addr.sin_family = AF_INET; /*Define the domain used*/
serv_addr.sin_port = htons(PORT); /*Declare port #PORT to be used*/
serv_addr.sin_addr.s_addr = inet_addr("INADDR_ANY"); /*Permit any incoming IP address by declaring INADDR_ANY*/
setsockopt(socket_fd, SOL_SOCKET, SO_RCVTIMEO, (const char *)&tv , sizeof (struct timeval));
// Convert IPv4 and IPv6 addresses from text to binary form
if(inet_pton(AF_INET, SERVER, &serv_addr.sin_addr)<=0)
{
printf("\nInvalid address/ Address not supported \n");
return -1;
}
if (connect(socket_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\nConnection Failed \n");
return -1;
}
else
{
printf("\n Connected \n");
}
上面的代码对我来说很好用,但是当我尝试创建一个简单的函数来重新组合它时,当我尝试使用 sendto() 发送 cmd 时出现错误 bad file descriptor。
这是我的功能:
void open_socket( int s_fd, struct sockaddr_in s_addr, struct timeval tv, char* ID_IP, int ID_Port)
{
if ( (s_fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0 ) /* return 1 if okay */
{
printf("ERROR opening socket ");
}
s_addr.sin_family = AF_INET; /*Define the domain used*/
s_addr.sin_port = htons(ID_Port); /*Declare port #PORT to be used*/
s_addr.sin_addr.s_addr = inet_addr("INADDR_ANY"); /*Permit any incoming IP address by declaring INADDR_ANY*/
setsockopt(s_fd, SOL_SOCKET, SO_RCVTIMEO, (const char *)&tv , sizeof (struct timeval)); /*config du timeout*/
// Convert IPv4 and IPv6 addresses from text to binary form
if(inet_pton(AF_INET, ID_IP, &s_addr.sin_addr)<=0)
{
printf("\nInvalid address/ Address not supported \n");
}
if (connect(s_fd, (struct sockaddr *)&s_addr, sizeof(s_addr)) < 0)
{
printf("\nConnection Failed \n");
}
else
{
printf("Socket Connected\n" );
}
}
我尝试用 :
来称呼它 //SOCKET 1
struct sockaddr_in serv_addr; /* Server Socket address structure*/
int serv_len=sizeof(serv_addr);
int socket_fd;
struct timeval tv;
tv.tv_sec=1 ;
tv.tv_usec=0;
//FUNCTION CALL
open_socket( socket_fd, serv_addr, tv, SERVER, PORT);
错误出现在这里:
//send the message
if ( (sendto(socket_fd , cmd_final, BUFFLEN , 0 , (struct sockaddr *)&serv_addr, serv_len) ) < 0 )
{
perror("ERROR > send cmd failed : ");
return 0;
}
我很确定我搞砸了一些关于指针的基本知识(我是初学者,几年没有用 C 编码)......我尝试了很多不同的东西,但找不到任何解决方案。我会很感激一些帮助或在哪里寻找!
非常感谢!
【问题讨论】: