帮我写一段代码,实现客户端向服务端发送文件的socket代码,基于TCP和Linux
时间: 2024-05-02 10:18:35 浏览: 14
下面是一个简单的客户端向服务端发送文件的socket代码,基于TCP和Linux:
客户端:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define BUFSIZE 1024
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in servaddr;
char sendbuf[BUFSIZE];
FILE *fp;
int n;
if (argc != 3) {
printf("Usage: %s <IP address> <filename>\n", argv[0]);
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket error");
exit(1);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8888);
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) {
perror("inet_pton error");
exit(1);
}
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("connect error");
exit(1);
}
fp = fopen(argv[2], "rb");
if (fp == NULL) {
perror("fopen error");
exit(1);
}
while ((n = fread(sendbuf, sizeof(char), BUFSIZE, fp)) > 0) {
if (send(sockfd, sendbuf, n, 0) < 0) {
perror("send error");
exit(1);
}
}
fclose(fp);
close(sockfd);
return 0;
}
```
服务端:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define BUFSIZE 1024
int main(int argc, char *argv[])
{
int listenfd, connfd;
struct sockaddr_in servaddr, cliaddr;
char recvbuf[BUFSIZE];
FILE *fp;
int n;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd < 0) {
perror("socket error");
exit(1);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8888);
if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("bind error");
exit(1);
}
if (listen(listenfd, 5) < 0) {
perror("listen error");
exit(1);
}
while (1) {
memset(&cliaddr, 0, sizeof(cliaddr));
socklen_t cliaddrlen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddrlen);
if (connfd < 0) {
perror("accept error");
exit(1);
}
fp = fopen("recvfile", "wb");
if (fp == NULL) {
perror("fopen error");
exit(1);
}
while ((n = recv(connfd, recvbuf, BUFSIZE, 0)) > 0) {
if (fwrite(recvbuf, sizeof(char), n, fp) < n) {
perror("fwrite error");
exit(1);
}
}
fclose(fp);
close(connfd);
}
return 0;
}
```
注:上述代码仅作为示例,实际使用时需要进行错误处理和安全性检查。