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

vnjpjtjt  于 2024-01-06  发布在  其他
关注(0)|答案(2)|浏览(149)

我试图在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);
}

字符串

i7uq4tfw

i7uq4tfw1#

简而言之,客户端(sender,“writer”)需要调用connect(),服务器(listener,receiver,“reader”)需要调用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头的情况下工作。这种更改还删除了所有错误检查,所以请输入您自己的错误处理。

thtygnil

thtygnil2#

这并没有解决这篇文章的内容,但如果你只是从这个问题的标题来的,我犯了一个愚蠢的错误:
第一个月
这是错误的,应该是:
sin_addr.s_addr = htonl(INADDR_LOOPBACK);

sin_addr.s_addr = inet_addr("127.0.0.1");

相关问题