gpt4 book ai didi

c - 在C语言中使用套接字创建服务器和客户端应用程序检查文件

转载 作者:行者123 更新时间:2023-11-30 17:42:07 24 4
gpt4 key购买 nike

我对C语言了解很浅。实际上,我需要使用套接字客户端服务器编写应用程序来验证文件的存在。我有一个套接字示例,其中客户端发送到服务器字符“A”,服务器接收该字符,递增它并将“B”发送到客户端。客户端打印结果。我想根据我的需要重新制作这个例子。但考虑到我的知识,这并不像我想象的那么容易。我非常感谢您能为我提供的任何帮助。

客户端:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>

int main(){
int sockfd;
int len;
struct sockaddr_un address;
int result;
char ch='A';

const char *filename = "/home/nikolay/test.txt";

sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
address.sun_family = AF_UNIX;
strcpy(address.sun_path, "server_socket");
len = sizeof(address);
result = connect(sockfd, (struct sockaddr *)&address, len);
if(result == -1){
perror("oops : client");
exit(1);
}

//want to send filename to server
write(sockfd, &filename, sizeof(filename));

//want to receive result int value from server
read(sockfd, &result, sizeof(result));

if(result == 0){
printf("file %s\t exist\n", filename);
printf("result = %d\n", result);
}else{
printf("File %s\t not exist\n", filename);
printf("result = %d\n", result);
}

close(sockfd);
exit(0);
}

服务器:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>



int main() {
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_un server_address;
struct sockaddr_un client_address;

unlink("server_socket");
server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

server_address.sun_family = AF_UNIX;
strcpy(server_address.sun_path, "server_socket");
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

listen(server_sockfd, 5);
while(1) {
char *filename;
printf("server waiting\n");

client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, &client_len);

//read and write client data:
read(client_sockfd, &filename, sizeof(filename));

// how receive access to 'filename'?
int res = access(filename, F_OK);
//printf("filename = %s\n", filename);
printf("res = %d\n", res);

//send to client result check exist file
write(client_sockfd, &res, sizeof(res));
close(client_sockfd);
}
}

我如何发送到服务器文件的名称(字符串),然后服务器接收该字符串,检查该文件是否存在并将结果(int值)发送到客户端?

使用接收和发送进行一些更改。

客户端

send(sockfd, filename, strlen(filename), 0);

printf("client: send\n");
char* res;
recv(sockfd, res, strlen(res), 0);
printf("client: reseive\n");
if(strcasecmp(res, "1") == 0){
printf("file %s\t exist\n", filename);
}else if(strcasecmp(res, "-1") == 0){
printf("file %s\t not exist\n", filename);
}

服务器:

recv(client_sockfd, filename, strlen(filename), 0);
int res = access(filename, F_OK);
//printf("filename = %s\n", filename);
printf("res = %d\n", res);

//write(client_sockfd, &res, sizeof(res));
char* buffer;
snprintf (buffer, 10, "%d", res);
printf("convert to string: %s\n", buffer);
printf("buffer len: %d\n", strlen(buffer));
send(client_sockfd, buffer, strlen(buffer),0);

发生段错误。为什么会发生这种情况?控制台:

./client
client: send
res = -1
convert to string: -1
buffer len: 2
client: reseive
[1]+ Segmentation fault ./server

最佳答案

Some changes, using recv and send.

  char* res;
recv(sockfd, res, strlen(res), 0);

occured Segmentation fault error. Why did this can happened?

res 未初始化,其值不确定。然而,使用这个不确定的值作为 strlen() 的参数是错误的。让我们放弃失败的更改并让您的工作示例开始工作。

client:

  const char *filename = "/home/nikolay/test.txt";

//want to send filename to server
write(sockfd, &filename, sizeof(filename));

这里发送的不是文件名字符,而是指向它们的指针,这在服务器的地址空间中没有意义。简单修复:

    const char filename[] = "/home/nikolay/test.txt";

服务器:

        #include <limits.h>
char filename[PATH_MAX];

来自alk Dec 28 '13 at 15:21的评论也值得注意。

关于c - 在C语言中使用套接字创建服务器和客户端应用程序检查文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20812874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com