服务器和客户端的通信工作非常顺利。但是当我把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 ;
}
正如我所说,它发送数据但我只能得到第一个字。
答案 0 :(得分:-1)
看起来你正试图用TCP发送数据。在TCP数据中进入块。虽然我没有测试过您的代码,但我猜,客户端正在发送第一个字&#34; Hello&#34;,然后发送下一个字&#34; Bro&#34;。您可以使用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");
}
它收到第一个字&#34; Hello&#34;然后它继续循环,并执行接受。由于没有新的连接即将到来,它会被困在那里。
为避免这种情况,您可以采用多种方法。
保持接受不在while循环中。
OR
转到异步套接字。
我建议先选择第一种方法(保持接受while循环),然后在线上学习更多有关异步套接字的信息并尝试。
<强>更新强> 我只是把它放在一个调试器里。在从控制台读取数据时看起来,它看起来不是读取完整的字符串,它只读取第一个字。
因此,您可以更正该部分,然后您可以看到所需的结果。