TCP / IP SOCKET,错误读取? (LINUX)

问题描述 投票:-2回答:1

服务器和客户端的通信工作非常顺利。但是当我把smth写成像“Hello Bro”这样的单词时,我只看到来自服务器的“Hello”。我知道有一个小错误,但我找到了。我在等你的帮助。谢谢。

#include <stdio.h>       //SERVER
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <stdlib.h>
#include <wait.h>
#include <string.h>

int main(int argc,char *argv[]){

    int sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock<0){
        perror("Creat Error");
    }
    struct sockaddr_in server,client;

    server.sin_family=AF_INET;
    server.sin_addr.s_addr=INADDR_ANY;
    server.sin_port=htons(5000);
    char buff[1024];

    int b = bind(sock,(struct sockaddr*)&server,sizeof(server));
    if(b<0) {

        printf("Bind Error");
    }
    listen(sock,5);
    socklen_t clilen=sizeof(client);
    while(1) {

    int clientt = accept(sock,(struct sockaddr*)&client,&clilen);
    if(clientt<0){
        perror("Accept Error");
    }

        int r=read(clientt,buff,1024);

    if(r<0){
        perror("Receave Error");
    }


        printf("%s\n",buff);


        close(clientt);
    }



    return 0;
}

这是客户

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <stdlib.h>
#include <wait.h>
#include <string.h>
#include<netdb.h>
int main(int argc,char *argv[]){

    int sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock<0){
        perror("Creating Error");
    }

   struct hostent *host;
   struct sockaddr_in server ;
   server.sin_family=AF_INET;
   host = gethostbyname("127.0.0.1");
   server.sin_port=htons(5000);

   if (host<0){
        perror("Host Fail");
    }

    int c = connect(sock,(struct sockaddr*) &server,sizeof(server));
    if (c<0){
        perror("Connection Error");
    }
    char message[100],buff[100];

    printf("Enter Your Message: ");

    scanf("%s",message);

    int s = send(sock,message,strlen(message),0);

    if(s<0){
        perror("Send Error");
    }

    printf("Data is sent");


    close(sock);





 return 0 ;   
}

正如我所说,它发送数据,但我只能得到第一个字。

c linux sockets
1个回答
-1
投票

看起来你正试图用TCP发送数据。在TCP数据中进入块。虽然我没有测试过您的代码,但我猜,客户端会发送第一个单词“Hello”,然后发送下一个单词“Bro”。您可以使用wireshark或tcpdump并捕获数据包来验证这一点。

现在在你的服务器代码我怀疑下面部分。

while(1) {

    int clientt = accept(sock,(struct sockaddr*)&client,&clilen);
    if(clientt<0){
        perror("Accept Error");
    }

        int r=read(clientt,buff,1024);

    if(r<0){
        perror("Receave Error");
    }

它收到第一个单词“Hello”,然后它继续循环,并执行接受。由于没有新的连接即将到来,它会被困在那里。

为避免这种情况,您可以采用多种方法。

保持接受while while循环。

要么

去寻找异步套接字。

我会建议第一种方法(保持接受while while循环),当你在线上学习更多异步套接字并尝试时。

UPDATE 我把它放在调试器中。从控制台读取数据时看起来,它看起来不是读取完整的字符串,它只读取第一个字。

因此,您可以更正该部分,然后您可以看到所需的结果。

© www.soinside.com 2019 - 2024. All rights reserved.