c - 使用 INADDR_LOOPBACK 的环回示例不起作用

标签 c sockets tcp loopback

我试图在 C 中设置环回套接字,但没有任何效果。我正在尝试创建一个函数,它打开一个带有环回地址的套接字,将数据发送到套接字,然后从另一个函数读取数据,但没有任何效果。我相信我不知道如何使用与连接相关的功能。这是我到目前为止所取得的成就:

#include <sys/wait.h>       
#include <sys/types.h>       
#include <sys/socket.h>     
#include <netinet/in.h>       
#include <netdb.h>           
#include <unistd.h>             
#include <stdlib.h>         
#include <ctype.h>          
#include <signal.h>         
#include <iostream>
#include <cerrno>
#include <pthread.h>

int internal_s;

void function1(){
    if ((internal_s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        perror_exit("socket");

    /* Find server address */
    struct sockaddr_in loopback;
    struct sockaddr *serverptr = (struct sockaddr*)&loopback; 

    /*Convert port number to integer*/        
    loopback.sin_family = AF_INET;       /* Internet domain */
    loopback.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
    loopback.sin_port=htons(10000);

    /* Initiate connection */
    if (bind(internal_s,serverptr, sizeof(loopback))<0)
        perro("bind");

    int test=1;
    err=write(internal_s,&test,sizeof(int));
    if(err<0)
        perror(write);
}

void Open_Internal_sock(int socket_s){
    struct sockaddr_in loopback;
    struct sockaddr *serverptr = (struct sockaddr*)&loopback; 

    /*Convert port number to integer*/        
    loopback.sin_family = AF_INET;       /* Internet domain */
    loopback.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
    loopback.sin_port=htons(10000);

    /* Initiate connection */
    if (bind(socket_s,serverptr, sizeof(loopback))<0)
        perror("bind");//Invalid argument
    int test;
    if(read(socket_s,&test,sizeof(int))<0)
        perror("read");//herer it prints:Transport endpoint is not connected
}

int main(){
    function1(i);
    Open_Internal_sock(internal_s);
}

最佳答案

简而言之,客户端(发送者,“写入者”)需要调用connect(),服务端(监听者,接收者,“阅读者”)需要调用listen()accept()

服务器和客户端还需要单独的执行线程,因为一些套接字操作会阻塞并导致单个执行线程永远停止。最简单的可能是将 server.c 和 client.c 作为单独的程序。

此外,尝试在启用警告的情况下编译您的代码,例如 gcc -Wall 。现在有很多错误,编译器可以为您指出。要获得更清晰的消息,请尝试使用 clang 而不是 gcc 作为编译器。

我建议查看 http://kohala.com/start/unpv12e/unpv12e.tar.gz .使用 tar xzvf unpv12e.tar.gz 解压并查看 unpv12e/tcpcliserv/tcpcli01.c 和 unpv12e/tcpcliserv/tcpserv01.c。如果您想要复制和粘贴,请注意,例如 Listen() 中的大写字母需要更改为小写字母才能使代码在没有 unpv header 的情况下工作。此更改还会删除所有错误检查,因此请加入您自己的错误处理。

关于c - 使用 INADDR_LOOPBACK 的环回示例不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16787812/

相关文章:

python - 如何取消进行中的 Requests.Session.Get 请求?

c++ - 绑定(bind)错误 : Address already in use

c++ - 将一个结构转换为另一个

c - HAL_UART_Transmit_IT 如何在 STM32F091VB 上管理串行发送数据

c++ - 我们可以通过 D 总线访问数据成员和对象指针吗?

c - 使用#include“unit.c”使包含的任何子单元均可访问数组吗?

sockets - go net/http unix域套接字连接

java - java中如何知道tcp连接是否完成?

c++ - Unity3D中的高清视频通话

c++ - 使用 boost 的 TCP 零拷贝