【问题标题】:TCP/IP SOCKET , ERROR READING ? (LINUX)TCP/IP 套接字,读取错误? (Linux)
【发布时间】:2017-12-31 13:58:43
【问题描述】:

服务器和客户端通信运行良好。但是当我写像“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 ;   
}

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

【问题讨论】:

  • 'printf("%s\n",buff);'好的,首先,通读您的所有服务器和客户端代码,并确保所有需要 NUL 终止的字符数组的库调用都被消除,(最好),或者只在保证始终是的字符数组上调用NUL 终止。
  • 接下来,了解“SOCK_STREAM”的含义。如果 read() 完全返回正值,则无论对等方发送多少字节,都不能保证该值大于 1。
  • 尝试在调用send() 之后立即将fprintf(stderr, "after scanf(): message = '%s'\n", message) 之类的内容添加到服务器的代码中并获得启发。 :-)
  • 另外阅读 read() 的完整手册页可能会有所帮助。
  • scanf("%s") 替换为fgets。这样能解决吗?

标签: c linux sockets


【解决方案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循环,并执行accept。由于没有新的连接到来,它被卡在那里。

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

将 accept 排除在 while 循环之外。

使用异步套接字。

我会建议采用第一种方法(将 accept 排除在 while 循环之外),当您进一步了解异步套接字并尝试时。

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

所以你可以修正那部分,然后你就可以看到想要的结果。

【讨论】:

  • 有人在没有任何解释的情况下投了反对票。这里有什么问题,我放了什么。
  • 尽管您正在触及 TCP 套接字的关键点,这迟早会应用于 OP 的代码,但问题(仍然)在其他地方。顺便说一句,我没有让你回答。
猜你喜欢
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 2016-07-05
  • 2020-08-02
  • 2016-08-10
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多