【发布时间】: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。这样能解决吗?