TCP:建立TCP连接

时间:2012-11-22 15:13:49

标签: c sockets tcp ip

我已经阅读了很多关于与C联网的例子,而且我被困住了。我可以看到带有SYN标志的TCP数据包在线上(使用wireshark),但是接收端(我已经设置了一个虚拟机用于测试目的)不会发回任何内容,甚至不会发送RST。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <strings.h>


int establish_tcp(int port) {
    char *ip = "10.0.2.15"; /* Virtual Machine */
    struct sockaddr_in sockaddrin;
    struct hostent *host;
    int sock;

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock == -1) {
        fprintf(stderr, "Socket Error\n");
        exit(1);
    }

    sockaddrin.sin_family = AF_INET;

    host = gethostbyname(ip);
    if(host == NULL) {
        fprintf(stderr, "%s unknown host.\n", ip);
        exit(2);
    }

    /* copies the internet address into the struct */
    bcopy(host->h_addr, &sockaddrin.sin_addr, host->h_length);

    /* specify port (used by TCP a layer above */
    sockaddrin.sin_port = port;

    /* try to connect */
    return connect(sock, (struct sockaddr*) &sockaddrin, sizeof(struct sockaddr_in));
}

int main(void) {
    printf("status: %i\n", establish_tcp(80));
    return 0;
}

数据包超时需要一段时间,并返回-1作为状态代码。如何才能使目标机器不发送回复?我忽略了什么?


我想我已经发现不是设置问题。我正在运行Ubuntu 12.04。虚拟机是Debian Wheezy,我用ifconfig检查其IP。如果机器可以通过telnet到达,我试过了 为了避免可能与Virtual Box相关的问题,我尝试用Google替换IP,产生相同的结果。

1 个答案:

答案 0 :(得分:4)

最有可能的问题是:

sockaddrin.sin_port = port;

端口号必须是网络字节顺序,这与x86和x86_64计算机中的本机字节顺序不同。

更改为:

sockaddrin.sin_port = htons(port);