问题描述
在下面的程序中调用window.requestFileSystem(type,size,successCallback[,errorCallback]);
时,失败,显示connect
为22(errno
)。
EINVAL
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
int main(int argc,char** argv) {
if(argc != 3) { /* usage */
fprintf(stderr,"usage: talk address port\n");
return EXIT_FAILURE;
}
char* address = argv[1];
char* port = argv[2];
struct addrinfo hints;
struct addrinfo *servinfo;
struct addrinfo *clientinfo;
memset(&hints,sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
int gai_res = getaddrinfo(address,port,&hints,&servinfo);
if(gai_res) {
fprintf(stderr,"Failed to resolve remote address: %s\n",gai_strerror(gai_res));
return EXIT_FAILURE;
}
gai_res = getaddrinfo(NULL,&clientinfo);
if(gai_res) {
fprintf(stderr,"Failed to resolve local address: %s\n",gai_strerror(gai_res));
return EXIT_FAILURE;
}
int socket_fd = socket(servinfo->ai_family,servinfo->ai_socktype,servinfo->ai_protocol);
if(socket_fd == -1) {
fprintf(stderr,"Failed to open socket to remote host: %s\n",strerror(errno));
freeaddrinfo(servinfo);
return EXIT_FAILURE;
}
int bind_res = bind(socket_fd,clientinfo->ai_addr,clientinfo->ai_addrlen);
if(bind_res == -1) {
fprintf(stderr,"Failed to bind to socket: %s\n",strerror(errno));
freeaddrinfo(servinfo);
return EXIT_FAILURE;
}
int connect_res = connect(socket_fd,servinfo->ai_addr,servinfo->ai_addrlen);
if(connect_res == -1) {
fprintf(stderr,"Failed to connect to socket: %s\n",strerror(errno));
freeaddrinfo(servinfo);
return EXIT_FAILURE;
}
ssize_t bytes_sent = send(socket_fd,"Hello",7,0);
if(bytes_sent == -1) {
fprintf(stderr,"Failed to send to remote host: %s\n",strerror(errno));
freeaddrinfo(servinfo);
return EXIT_FAILURE;
}
printf("Sent message to %s on port %s\n",address,port);
close(socket_fd);
freeaddrinfo(servinfo);
return EXIT_SUCCESS;
}
当我检查GDB中$ gcc talk.c -Wall -Wextra -Wshadow -pedantic -std=gnu99 -g3 -o talk
$ ./talk 192.168.0.16 3301
Failed to connect to socket: Invalid argument
的内容时,一切似乎都很好:
servinfo
请注意,在UDP套接字上调用$ gdb talk -q
Reading symbols from talk...done.
(gdb) b main.c:63
Breakpoint 1 at 0x13fb: file main.c,line 63.
(gdb) run 192.168.0.16 3301
Starting program: /home/foo/dev/tmp/talk/talk 192.168.0.16 3301
Breakpoint 1,main (argc=3,argv=0x7fffffffe328) at main.c:63
63 int connect_res = connect(socket_fd,(gdb) p servinfo
$1 = (struct addrinfo *) 0x555555559260
(gdb) p *servinfo
$2 = {ai_flags = 0,ai_family = 2,ai_socktype = 2,ai_protocol = 17,ai_addrlen = 16,ai_addr = 0x555555559290,ai_canonname = 0x0,ai_next = 0x0}
(gdb) p servinfo->ai_addr
$3 = (struct sockaddr *) 0x555555559290
(gdb) p *(servinfo->ai_addr)
$4 = {sa_family = 2,sa_data = "\f\345\300\250\000\020\000\000\000\000\000\000\000"}
是定义明确的,并且这样做(至少在这种情况下)是为了方便使用connect
和send
(而不是它们的数据报)同行)。
在这种情况下,recv
的哪些参数无效?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)