【问题标题】:Client: recv transport endpoint not connected客户端:recv 传输端点未连接
【发布时间】:2012-12-02 21:24:46
【问题描述】:

我正在尝试实现一个客户端-服务器程序。 但是,虽然服务器程序运行良好,但客户端程序退出并出现错误: recv:传输端点未连接。 它让我困惑了很长一段时间。一些帮助将不胜感激! 这是服务器程序::

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

int main()
{
    int sockid,newsockid,pid;
    struct sockaddr_in myaddr,clientaddr;
    socklen_t x;
    x=sizeof(clientaddr);
    char msg[20];
    sockid=socket(AF_INET,SOCK_STREAM,0);
    if(sockid == -1)
        perror("SOCKET");
    memset(&myaddr,0,sizeof(myaddr));
    myaddr.sin_family=AF_INET;
    myaddr.sin_port=htons(8888);
    myaddr.sin_addr.s_addr=inet_addr(INADDR_ANY);
    if(bind(sockid,(const struct sockaddr *)&myaddr,sizeof(myaddr)) == -1)
        perror("bind");
    listen(sockid,5);
    newsockid=accept(sockid,(struct sockaddr *)&clientaddr,&x);
    if(newsockid == -1)
        perror("accept");
    printf("NEW CLIENT ADDR:: %s",ntohs(clientaddr.sin_addr.s_addr));
    pid=fork();
    while(1)
    {   
        if(pid == 0)
        {
            memset(msg,'\0',20);
            if(recv(newsockid,msg,sizeof(msg),0) == -1)
                perror("recv");
            puts(msg);
            if(strcmp(msg,"exit") == 0)
            {
                close(newsockid);
                exit(getpid());
            }
        }
        if(pid!=0)
        {
            memset(msg,'\0',20);
            gets(msg);
            if(send(newsockid,msg,sizeof(msg),0) == -1)
                perror("send");
            if(strcmp(msg,"exit") == 0)
            {
                close(newsockid);
                exit(getpid());
            }
        }
    }
    return 0;
}

这里也是客户端::

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

int main()
{
    int pid,sockfd;
    char msg[20];
    struct sockaddr_in myaddr;
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd == -1)
        perror("socket");
    myaddr.sin_family=AF_INET;
    myaddr.sin_port=htons(8888);
    myaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
    if(connect(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr)) == -1)
        perror("connect");
    pid=fork();
    while(1)
    {
        if(pid == 0)
        {
            memset(msg,'\0',20);
            if(recv(sockfd,msg,sizeof(msg),0) == -1)
            {
                perror("recv");
                exit(getpid());
            }
            puts(msg);
            if(strcmp(msg,"exit") == 0)
            {
                close(sockfd);
                exit(getpid());
            }
        }
        if(pid!=0)
        {
            memset(msg,'\0',20);
            gets(msg);
            if(send(sockfd,msg,sizeof(msg),0) == -1)
                perror("send");
            if(strcmp(msg,"exit") == 0)
            {
                close(sockfd);
                exit(getpid());
            }
        }
    }
    return 0;
}

【问题讨论】:

  • 尝试在recv失败后记录errno的值。 recv man page 列出了 errno 的值及其原因。
  • 在调用 send() 之后,'msg' 怎么会等于“exit”?

标签: c sockets networking


【解决方案1】:

服务器代码中有 2 个错误。

这一行有一个:

myaddr.sin_addr.s_addr=inet_addr(INADDR_ANY);

inet_addr 函数需要一个字符串,而INADDR_ANY 常量是一个全零的 IP 号。在更正此行之前,服务器代码因分段错误而崩溃(它真的对您有用吗?)。正确用法:

myaddr.sin_addr.s_addr=htonl(INADDR_ANY);

另外,printf 行不正确 - 地址不短,但长,您也不能使用 %s(它很可能会崩溃)。请注意,编译器(至少是gcc)会发出警告——您应该始终启用并阅读编译器警告。作为快速修复,我将其更改为:

printf("NEW CLIENT ADDR:: %08x",ntohl(clientaddr.sin_addr.s_addr));

只要你能以十六进制读取 IP 就可以了 :)

通过这些修复它对我来说很好(我的意思是服务器和客户端) - 请注意,可能存在其他错误,我不得不承认我没有仔细阅读它。

【讨论】:

  • 好的..我按照您的建议进行了更改..但是我的客户端在运行时仍然给我同样的错误..
  • 好的,那我问一下 - 它是什么平台?您是否尝试过按照@simonc 的建议打印errno?或许您应该尝试使用 strace (en.wikipedia.org/wiki/Strace) 来诊断问题?
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 2018-11-06
  • 2017-01-02
  • 1970-01-01
  • 2019-11-02
  • 2012-12-30
相关资源
最近更新 更多