Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将sockaddr_作为参数传入时,connect()函数失败_C_Sockets_Connect - Fatal编程技术网

将sockaddr_作为参数传入时,connect()函数失败

将sockaddr_作为参数传入时,connect()函数失败,c,sockets,connect,C,Sockets,Connect,我已经在这里呆了很长时间了,所以我真的希望有人能给我一些关于正在发生的事情的深刻见解 我有以下主要功能: #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #i

我已经在这里呆了很长时间了,所以我真的希望有人能给我一些关于正在发生的事情的深刻见解

我有以下主要功能:

#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv) {

char *serv_IP;
in_port_t serv_port;
int sock;
struct sockaddr_in serv_addr;

serv_IP = argv[1];
serv_port = atoi(argv[2]);

if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
    fprintf(stderr, "Failed to create TCP socket\r\n");
    exit(1);
}

memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;

if (inet_pton(AF_INET, serv_IP, &serv_addr.sin_addr.s_addr) == 0) {
    fprintf(stderr, "Invalid IP address\r\n");
    exit(1);
}

serv_addr.sin_port = htons(serv_port);

if (connect(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
    fprintf(stderr, "Failed to connect to serv\r\n");
    exit(1);
}
else {
    printf("You're connected!\n);
}
close(sock)
return 0;
}
一旦调用该函数,就会打印出正确的IP和端口号,但我仍然无法连接到服务器。唯一的区别是,在我的main function()中,我在connect调用的serv_addr前面加了一个&-I.e.,connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)),以引用它的地址,而我在helper函数中不这样做,因为serv_addr的地址已经作为参数传递了,即connect(sock,(struct sockaddr*)serv_addr,sizeof(serv_addr))。如果我添加了&,这没有什么区别,只是为了防止您感到奇怪

那么,既然&serv_addr被正确地传递给function(),正如我能够打印出正确的IP和端口号所验证的那样,为什么我可以在main()中连接,但当我将serv_addr结构作为参数传递给另一个函数并从那里调用connect()时却不行呢

提前感谢您的帮助!

sizeof(serv\u addr)
serv\u addr
中声明为
sockaddr\u时,返回16,但返回4(32位)或8(64位)当在*
中声明为
sockaddr\u时,
AF\u INET
需要16。如果您在
connect()
失败时查看了
errno
,它会告诉您传递的参数值无效

您需要直接使用
sizeof(sockaddr\u in)
,或者:

void function(int sock, struct sockaddr_in *serv_addr)
{
    if (connect(sock, (struct sockaddr *) serv_addr, sizeof(sockaddr_in)) < 0)

成功了!非常感谢您的快速响应!!我从来没有想过sizeof()的返回是一个潜在的问题,它会返回不同大小的实际值和指向值的指针。不过这完全是有道理的。我刚刚读到了errno.h头以及如何使用它

固定它的确切线路是:

if (connect(sock, (struct sockaddr *) serv_addr, sizeof(struct sockaddr_in)) < 0)
if(connect(sock,(struct sockaddr*)serv_addr,sizeof(struct sockaddr_in))<0)
我说得对,serv_add前面不需要“&”。您还需要sizeof()中的“struct”,否则它会将sockaddr_作为未声明的变量返回

无论如何,再次谢谢你


现在我终于可以继续我的代码了。

如何失败?您需要提供
errno
的值,就像调用
connect()
之后,即在任何其他
printf()
调用之前一样。
void function(int sock, struct sockaddr_in *serv_addr)
{
    if (connect(sock, (struct sockaddr *) serv_addr, sizeof(sockaddr_in)) < 0)
void function(int sock, struct sockaddr_in *serv_addr)
{
    if (connect(sock, (struct sockaddr *) serv_addr, sizeof(*serv_addr)) < 0)
if (connect(sock, (struct sockaddr *) serv_addr, sizeof(struct sockaddr_in)) < 0)