帮我写一个c语言socket发送图片
时间: 2023-08-31 07:28:46 浏览: 70
### 回答1:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>// 声明函数
void error(const char *msg);int main(int argc, char *argv[])
{
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
char buffer[256] = {0};
// 检查参数
if (argc < 3)
{
fprintf(stderr,"usage %s hostname port\n", argv[0]);
exit(0);
}
// 把端口号转换为整数
portno = atoi(argv[2]);
// 创建socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
// 获取服务器主机信息
server = gethostbyname(argv[1]);
if (server == NULL)
{
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
// 清空结构体
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
// 复制服务器ip到结构体
bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
// 设置端口号
serv_addr.sin_port = htons(portno);
// 连接服务器
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
error("ERROR connecting");
// 向服务器发送数据
printf("Please enter the image file name: ");
bzero(buffer, 256);
fgets(buffer, 255, stdin);
n = write(sockfd, buffer, strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
// 从服务器读取数据
bzero(buffer, 256);
n = read(sockfd, buffer, 255);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n", buffer);
close(sockfd);
return 0;
}// 错误处理函数
void error(const char *msg)
{
perror(msg);
exit(0);
}
### 回答2:
当使用C语言编写一个用于发送图片的socket程序时,我们可以按照以下步骤进行操作:
步骤1:导入头文件
首先,我们需要导入一些必要的头文件,包括<stdio.h>、<stdlib.h>、<string.h>、<sys/types.h>、<sys/socket.h>、<netinet/in.h>等。
步骤2:创建套接字
使用socket()函数创建一个套接字,指定通信的协议、IP地址和端口号。
步骤3:定义服务器地址和端口号
在程序中定义服务器的IP地址和端口号。
步骤4:连接服务器
使用connect()函数将套接字连接到服务器。
步骤5:读取图片数据
使用二进制模式打开要发送的图片文件,并将其读入一个缓冲区中。
步骤6:发送图片数据
使用send()函数将读取的图片数据发送到服务器。
步骤7:关闭文件和套接字
关闭打开的图片文件和套接字。
步骤8:结束程序
结束程序并返回。
下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8888
#define BUFF_SIZE 1024
int main() {
int clientSocket;
char buffer[BUFF_SIZE];
struct sockaddr_in serverAddr;
FILE *fp;
// 创建套接字
clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket < 0) {
perror("Error in socket");
exit(1);
}
// 定义服务器地址和端口号
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
// 连接服务器
if (connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
perror("Error in connect");
exit(1);
}
// 读取图片数据
fp = fopen("image.png", "rb");
if (fp == NULL) {
perror("Error opening file");
exit(1);
}
while (fgets(buffer, BUFF_SIZE, fp) != NULL) {
// 发送图片数据
if (send(clientSocket, buffer, sizeof(buffer), 0) == -1) {
perror("Error in send");
exit(1);
}
bzero(buffer, BUFF_SIZE);
}
// 关闭文件和套接字
fclose(fp);
close(clientSocket);
return 0;
}
```
请注意,上述代码仅提供了一个简单的示例,实际上还需要进行错误检查和适当的异常处理。
### 回答3:
当然可以帮您写一个C语言的Socket发送图片的示例代码。以下是一个基本的示例:
1. 首先,需要包含相关的头文件:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
```
2. 创建一个函数,用于发送图片:
```c
int send_image(int socket, const char* image_path) {
FILE* file = fopen(image_path, "rb");
if (!file) {
printf("无法打开图片文件!\n");
return -1;
}
fseek(file, 0, SEEK_END);
long file_size = ftell(file);
fseek(file, 0, SEEK_SET);
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
int total_bytes_sent = 0;
while (total_bytes_sent < file_size) {
size_t bytes_to_send = sizeof(buffer);
if (total_bytes_sent + bytes_to_send > file_size) {
bytes_to_send = file_size - total_bytes_sent;
memset(buffer, 0, sizeof(buffer));
}
fread(buffer, 1, bytes_to_send, file);
int bytes_sent = send(socket, buffer, bytes_to_send, 0);
if (bytes_sent == -1) {
printf("发送图片失败!\n");
fclose(file);
return -1;
}
total_bytes_sent += bytes_sent;
}
fclose(file);
return 0;
}
```
3. 在主函数中,创建一个Socket连接并调用`send_image`函数发送图片:
```c
int main() {
// 创建Socket
int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if (socket_fd == -1) {
printf("无法创建Socket!\n");
return -1;
}
// 设置服务器信息
struct sockaddr_in server_address;
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr("服务器IP地址");
server_address.sin_port = htons(服务器端口号);
// 连接服务器
if (connect(socket_fd, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) {
printf("无法连接到服务器!\n");
close(socket_fd);
return -1;
}
// 发送图片
const char* image_path = "图片文件路径";
int result = send_image(socket_fd, image_path);
if (result == -1) {
printf("发送图片失败!\n");
} else {
printf("图片发送成功!\n");
}
// 关闭Socket连接
close(socket_fd);
return 0;
}
```
请注意替换代码中的以下部分:
- `服务器IP地址`:将其替换为目标服务器的IP地址。
- `服务器端口号`:将其替换为目标服务器的端口号。
- `图片文件路径`:将其替换为要发送的图片文件的路径。
这只是一个基本示例代码,您可以根据自己的需求进行修改和扩展。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)