首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCP:建立TCP连接

TCP:建立TCP连接
EN

Stack Overflow用户
提问于 2012-11-22 15:13:49
回答 1查看 5.8K关注 0票数 1

我读过很多关于与C建立网络的例子,而且我被困住了。我可以看到带有SYN标志的TCP数据包在线路上(带有wireshark),但是接收端(我已经为测试目的设置了虚拟机)没有发送任何东西,甚至没有发送RST。

代码语言:javascript
复制
#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作为状态代码返回。目标机器怎么会不发送回复呢?我忽略了什么?

我想我已经意识到这不是一个设置问题。我在运行Ubuntu12.04。虚拟机是一个Debian,我用ifconfig检查它的IP。我试过,如果这台机器可以与telnet联系。

为了避免与Virtual相关的问题,我尝试用Google的IP来代替IP,产生同样的结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-22 15:19:34

最可能的问题是:

代码语言:javascript
复制
sockaddrin.sin_port = port;

端口号必须按网络字节顺序排列,这与x86和x86_64机器中的本地字节顺序不同。

改为:

代码语言:javascript
复制
sockaddrin.sin_port = htons(port);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13515599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档