我最近开始在C中使用TCP套接字(我还不熟悉这些套接字),在我弄清楚它们背后的理论之后,我尝试创建一个简单的服务器/客户端,客户端需要来自服务器的字符串,然后将其打印出来。
这是服务器的代码:
//SERVER
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<sys/types.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<sys/wait.h>
#include<signal.h>
#define BACKLOG 5
int main(){
char *msg;
int len, bytes_sent;
struct sockaddr_storage their_addr;
socklen_t addr_size;
struct addrinfo hints, *res;
int sockfd,new_fd;
memset(&hints,0,sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
getaddrinfo("127.0.0.1", "3940", &hints, &res);
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
bind(sockfd, res->ai_addr, res->ai_addrlen);
if(listen(sockfd, BACKLOG) == 0){
printf("Listening\n");
}
else{
printf("Error\n");
exit(1);
}
addr_size = sizeof their_addr;
new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &addr_size);
strcpy(msg, "HELLO WORLD!");
len = strlen(msg);
bytes_sent = send(new_fd,msg,len,0);
printf("\nMessage sent");
close(new_fd);
close(sockfd);
freeaddrinfo(res);
return 0;
}
这是客户端的代码:
//CLIENT
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<sys/types.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<sys/wait.h>
#include<signal.h>
int main(){
int sockfd;
char buffer[1024];
struct addrinfo hints, *res;
memset(&hints,0,sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
getaddrinfo("127.0.0.1", "3940", &hints, &res);
sockfd = socket(res->ai_family,res->ai_socktype, res->ai_protocol);
connect(sockfd, res->ai_addr, res->ai_addrlen);
recv(sockfd, buffer, 1024, 0);
printf("Data received: %s\n",buffer);
close(sockfd);
return 0;
}
现在问题出在这里。它应该发生的是客户应该打印一个简单的Data received : HELLO WORLD
。关键是它确实如此,但也打印了一些我不理解的东西,并且无法弄清楚它为什么会这样做。这是客户端结果的图片(我在虚拟机上使用Linux)
正如您在HELLO WORLD之后所看到的,客户打印了3个字符。
我知道这个问题可能是我错过的一个检查(或类似的事情),但我已经说过我还是新手,所以我不知道还有什么要添加或者我不应该在代码中加入什么。 提前谢谢!