各位大虾,小弟最近在做linux udp 传输图片的项目,我已经写了初步的代码,可以实现client把test.txt的内容发送到server上显示出来,以下是我写的代码:
client 部分:
/*client.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#define PORT 8888
#define BUFFER_SIZE 1024
int main(int argc, char *argv[])
{
int sockfd, sendbytes, recvbytes,nRead;;
char buf[BUFFER_SIZE];
char buf1[1024];
struct hostent *host;
struct sockaddr_in serv_addr;
int addr_len;
FILE *fp;
if(argc < 3)
{
fprintf(stderr,"USAGE: ./client Hostname(or ip address) Text\n");
exit(1);
}
/*地址解析函数*/
if ((host = gethostbyname(argv[1])) == NULL)
{
perror("gethostbyname");
exit(1);
}
/*创建socket*/
if ((sockfd = socket(AF_INET,SOCK_DGRAM,0)) == -1)
{
perror("socket");
exit(1);
}
/*设置sockaddr_in 结构体中相关参数*/
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero), 8);
addr_len = sizeof(serv_addr);
fp = fopen("test.txt","r");
memset(buf, 0, sizeof(buf));
nRead = fread(buf,sizeof(char),100,fp); //把文件的内容读进缓存
sprintf(buf1, "%s", argv[2]);
if( fp == NULL)
{
printf("open file fail");
}
else
{
printf("file_block_num = %d\n",nRead); //打印包的数量
/*发送消息给服务器端*/
if ((sendbytes = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*)&serv_addr, addr_len)) == -1)
{
perror("send");
exit(1);
}
}
printf("send success\n");
recvbytes = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&serv_addr, &addr_len);
if (recvbytes < 0)
{
perror("recvfrom");
}
buf[recvbytes] = 0;
printf("From server: %s\n", buf);
close(sockfd);
exit(0);
}
server部分:
/*client.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#define PORT 8888
#define BUFFER_SIZE 1024
int main(int argc, char *argv[])
{
int sockfd, sendbytes, recvbytes,nRead;;
char buf[BUFFER_SIZE];
char buf1[1024];
struct hostent *host;
struct sockaddr_in serv_addr;
int addr_len;
FILE *fp;
if(argc < 3)
{
fprintf(stderr,"USAGE: ./client Hostname(or ip address) Text\n");
exit(1);
}
/*地址解析函数*/
if ((host = gethostbyname(argv[1])) == NULL)
{
perror("gethostbyname");
exit(1);
}
/*创建socket*/
if ((sockfd = socket(AF_INET,SOCK_DGRAM,0)) == -1)
{
perror("socket");
exit(1);
}
/*设置sockaddr_in 结构体中相关参数*/
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero), 8);
addr_len = sizeof(serv_addr);
fp = fopen("test.txt","r");
memset(buf, 0, sizeof(buf));
nRead = fread(buf,sizeof(char),100,fp); //把文件的内容读进缓存
sprintf(buf1, "%s", argv[2]);
if( fp == NULL)
{
printf("open file fail");
}
else
{
printf("file_block_num = %d\n",nRead); //打印包的数量
/*发送消息给服务器端*/
if ((sendbytes = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*)&serv_addr, addr_len)) == -1)
{
perror("send");
exit(1);
}
}
printf("send success\n");
recvbytes = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&serv_addr, &addr_len);
if (recvbytes < 0)
{
perror("recvfrom");
}
buf[recvbytes] = 0;
printf("From server: %s\n", buf);
close(sockfd);
exit(0);
}
最关键的分包跟组包算法,小弟想了很久都没个结果,请大家帮帮忙。
我有个vc++环境下的udp传输文件的工程,想在上面下手,可是看了半天也不知道该如何移植到linux上去运行,求大家帮忙