簡體   English   中英

客戶端:接收傳輸端點未連接

[英]Client: recv transport endpoint not connected

我正在嘗試實施客戶端服務器程序。 但是,盡管服務器程序運行良好,但客戶端程序退出並顯示錯誤:: 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;
}

服務器代碼中有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,就可以了:)

有了這些修復程序,它對我來說效果很好(我的意思是服務器和客戶端)-請注意,可能還有其他錯誤,我不得不承認我沒有仔細閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM