/* ************************************************************************
* Filename: tcpudp.c
* Description:
* Version: 1.0
* Revision: none
* Compiler: gcc
* Company:
* ************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
/******************************************
** define
*/
#define IPMSG_OUT_MSG_COLOR(x) { \
write(1, "\033[31m", 5);\
x \
write(1, "\033[32m", 5);}
#define PORT 6060
/******************************************
** typedef
*/
//函数指针
typedef void (*FUN)(int argc, char *argv[]);
//命令结构体
typedef struct cmd
{
char *name; //命令名称
FUN fun; //命令处理函数
}CMD;
//文件信息结构体
typedef struct filelist
{
char name[50];
int num;
long pkgnum;
long size;
long ltime;
char user[10];
struct filelist *next;
}IPMSG_FILE;
//用户信息结构体
typedef struct userlist
{
char name[20]; //用户名
char host[20]; //主机名
int s_addr; //IP地址(32位网络字节序)
struct userlist *next;
}IPMSG_USER;
/******************************************
** static
*/
static int udpfd = 0;
static int tcpfd = 0;
static char user_name[20] = "";
static char host_name[30] = "";
//退出命令
void exit_fun(int argc, char *argv[])
{
exit(1);
}
//清屏命令
void clear_fun(int argc, char *argv[])
{
write(1, "\033[2J\033[0;0H", 10);
}
//命令数组:用来保存 命令名 和 处理函数名
CMD cmdlist[]={
{"exit", exit_fun},
{"quit", exit_fun},
{"clear", clear_fun},
{"cls", clear_fun}
};
/******************************************
** fun()
*/
int tcp_fd(void)
{
return tcpfd;
}
int udp_fd(void)
{
return udpfd;
}
//创建UDP 和 TCP_Server 套接口
void tcp_create_server()
{
struct sockaddr_in addr = {AF_INET};
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
//Create TCP socket for SendFile Server
tcpfd = socket(AF_INET,SOCK_STREAM,0);
if(tcpfd < 0)
{
perror("Socket TCP");
exit(-1);
}
if(bind(tcpfd, (struct sockaddr*)&addr, sizeof(addr))<0)
{
perror("Bind TCP");
exit(1);
}
listen(tcpfd, 10);
}
void udp_create_server()
{
int broadcast=1;
struct sockaddr_in addr = {AF_INET};
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
//Create UDP socket for commucation
udpfd = socket(AF_INET,SOCK_DGRAM,0);
if(udpfd < 0)
{
perror("Socket UDP");
exit(-1);
}
if(bind(udpfd, (struct sockaddr*)&addr, sizeof(addr))<0)
{
perror("Bind UDP");
exit(1);
}
setsockopt(udpfd,SOL_SOCKET,SO_BROADCAST,&broadcast, sizeof(int));//允许发送广播数据。
}
//发送消息
void udp_msg_send(char *msg, int len, struct sockaddr_in addr)
{
sendto(udp_fd(), msg, len, 0, (struct sockaddr*)&addr, sizeof(addr));
}
//接收消息
void udp_recv_msg(struct sockaddr_in *in)
{
char buf[500]="";
struct sockaddr_in addr = {AF_INET};
unsigned int addrlen = sizeof(addr);
int len = 0;
len = recvfrom(udp_fd(), buf, sizeof(buf), 0, (struct sockaddr*)&addr, &addrlen);
*in = addr;
printf("udp receive message=%s \n message size=%d\n",buf,len);
}
//广播
void udp_send_boardcast(void)
{
char buf[100]="client boardcast";
struct sockaddr_in addr = {AF_INET};
int t = time((time_t *)NULL);
int len = strlen(buf);
//int len = sprintf(buf,"1:%d:%s:%s:%ld:%s",
// t,user_name,host_name,IPMSG_BR_ENTRY,user_name);
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(-1); //modified by wangyanjun in 10/7/9
//addr.sin_addr.s_addr=inet_addr("255.255.255.255");
sendto(udpfd, buf, len, 0, (struct sockaddr*)&addr,sizeof(addr));
}
int tcp_recvfile()
{
int fd = 0;
int s_addr = 0;//接收地址
struct sockaddr_in addr = {AF_INET};
unsigned long len = 0;
char buf[2048]="tcp_recvfile";
FILE *fp = NULL;
int file_size=10;
fd = socket(AF_INET, SOCK_STREAM, 0); //创建临时TCP client用来接收文件
if( fd < 0 )
{
printf("recv file error: creat socket error!\n");
return -1;
}
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = s_addr;
if(connect(fd, (struct sockaddr*)&addr, sizeof(addr))!=0)
{
perror("recvfile connect");
return -1;
}
len = strlen(buf);
//len = sprintf(buf, "1:%ld:%s:%s:%ld:%lx:%x:%x", time((time_t*)NULL),\
// user(), host(), IPMSG_GETFILEDATA, p->pkgnum, p->num, 0);
send(fd, buf, len, 0); //发送IPMSG_GETFILEDATA
fp = fopen("fileName", "w");
if( fp==NULL )
{
perror("savefile");
return -1;
}
len = 0;
do //接收文件
{
int rlen = recv(fd, buf, sizeof(buf), 0);
len += rlen;
printf("\rrecvlen=%d%%", (int)((100*len)/file_size));
fflush(stdout);
fwrite(buf, 1, rlen, fp);
}while(len < file_size);
printf("\n");
close(fd); //关闭TCP Client
fclose(fp); //关闭文件
return 0;
}
void tcp_sendfile(void)
{
int fd = tcp_fd(); //获取TCP_Server套接口描述符
struct sockaddr_in addr = {AF_INET};
unsigned int addrlen = sizeof(addr);
int clifd = 0;
int file_size=10;
clifd=accept(fd, (struct sockaddr*)&addr, &addrlen);
if( clifd<0 )
{
perror("accept");
return;
}
while(1)
{
char buf[1400]="";
FILE *fp = NULL;
int sendsize = 0;
//接收IPMSG_GETFILEDATA
if(recv(clifd, buf, sizeof(buf), 0)==0) break;
if( (fp=fopen("fileName", "r"))==NULL )
{
printf("senderror: no such file: %s\n", "fileName");
return ;
}
do //发送文件
{
int size = fread(buf, 1, sizeof(buf), fp);
send(clifd, buf, size, 0);
sendsize += size;
}while(sendsize < file_size);
fclose(fp); //关闭文件
}// 循环发送多个文件
close(clifd); //关闭套接口等待下个用户连接
return;
}
void main()
{
struct sockaddr_in addr = {AF_INET};
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
printf("cread udp client start...\n");
udp_create_server();
while(1)
{
udp_send_boardcast();
sleep(15);
udp_recv_msg(&addr);//阻塞
udp_msg_send("client udp ",strlen("client udp "),addr);
}
printf("end of main\n");
}
* Filename: tcpudp.c
* Description:
* Version: 1.0
* Revision: none
* Compiler: gcc
* Company:
* ************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
/******************************************
** define
*/
#define IPMSG_OUT_MSG_COLOR(x) { \
write(1, "\033[31m", 5);\
x \
write(1, "\033[32m", 5);}
#define PORT 6060
/******************************************
** typedef
*/
//函数指针
typedef void (*FUN)(int argc, char *argv[]);
//命令结构体
typedef struct cmd
{
char *name; //命令名称
FUN fun; //命令处理函数
}CMD;
//文件信息结构体
typedef struct filelist
{
char name[50];
int num;
long pkgnum;
long size;
long ltime;
char user[10];
struct filelist *next;
}IPMSG_FILE;
//用户信息结构体
typedef struct userlist
{
char name[20]; //用户名
char host[20]; //主机名
int s_addr; //IP地址(32位网络字节序)
struct userlist *next;
}IPMSG_USER;
/******************************************
** static
*/
static int udpfd = 0;
static int tcpfd = 0;
static char user_name[20] = "";
static char host_name[30] = "";
//退出命令
void exit_fun(int argc, char *argv[])
{
exit(1);
}
//清屏命令
void clear_fun(int argc, char *argv[])
{
write(1, "\033[2J\033[0;0H", 10);
}
//命令数组:用来保存 命令名 和 处理函数名
CMD cmdlist[]={
{"exit", exit_fun},
{"quit", exit_fun},
{"clear", clear_fun},
{"cls", clear_fun}
};
/******************************************
** fun()
*/
int tcp_fd(void)
{
return tcpfd;
}
int udp_fd(void)
{
return udpfd;
}
//创建UDP 和 TCP_Server 套接口
void tcp_create_server()
{
struct sockaddr_in addr = {AF_INET};
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
//Create TCP socket for SendFile Server
tcpfd = socket(AF_INET,SOCK_STREAM,0);
if(tcpfd < 0)
{
perror("Socket TCP");
exit(-1);
}
if(bind(tcpfd, (struct sockaddr*)&addr, sizeof(addr))<0)
{
perror("Bind TCP");
exit(1);
}
listen(tcpfd, 10);
}
void udp_create_server()
{
int broadcast=1;
struct sockaddr_in addr = {AF_INET};
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
//Create UDP socket for commucation
udpfd = socket(AF_INET,SOCK_DGRAM,0);
if(udpfd < 0)
{
perror("Socket UDP");
exit(-1);
}
if(bind(udpfd, (struct sockaddr*)&addr, sizeof(addr))<0)
{
perror("Bind UDP");
exit(1);
}
setsockopt(udpfd,SOL_SOCKET,SO_BROADCAST,&broadcast, sizeof(int));//允许发送广播数据。
}
//发送消息
void udp_msg_send(char *msg, int len, struct sockaddr_in addr)
{
sendto(udp_fd(), msg, len, 0, (struct sockaddr*)&addr, sizeof(addr));
}
//接收消息
void udp_recv_msg(struct sockaddr_in *in)
{
char buf[500]="";
struct sockaddr_in addr = {AF_INET};
unsigned int addrlen = sizeof(addr);
int len = 0;
len = recvfrom(udp_fd(), buf, sizeof(buf), 0, (struct sockaddr*)&addr, &addrlen);
*in = addr;
printf("udp receive message=%s \n message size=%d\n",buf,len);
}
//广播
void udp_send_boardcast(void)
{
char buf[100]="client boardcast";
struct sockaddr_in addr = {AF_INET};
int t = time((time_t *)NULL);
int len = strlen(buf);
//int len = sprintf(buf,"1:%d:%s:%s:%ld:%s",
// t,user_name,host_name,IPMSG_BR_ENTRY,user_name);
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(-1); //modified by wangyanjun in 10/7/9
//addr.sin_addr.s_addr=inet_addr("255.255.255.255");
sendto(udpfd, buf, len, 0, (struct sockaddr*)&addr,sizeof(addr));
}
int tcp_recvfile()
{
int fd = 0;
int s_addr = 0;//接收地址
struct sockaddr_in addr = {AF_INET};
unsigned long len = 0;
char buf[2048]="tcp_recvfile";
FILE *fp = NULL;
int file_size=10;
fd = socket(AF_INET, SOCK_STREAM, 0); //创建临时TCP client用来接收文件
if( fd < 0 )
{
printf("recv file error: creat socket error!\n");
return -1;
}
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = s_addr;
if(connect(fd, (struct sockaddr*)&addr, sizeof(addr))!=0)
{
perror("recvfile connect");
return -1;
}
len = strlen(buf);
//len = sprintf(buf, "1:%ld:%s:%s:%ld:%lx:%x:%x", time((time_t*)NULL),\
// user(), host(), IPMSG_GETFILEDATA, p->pkgnum, p->num, 0);
send(fd, buf, len, 0); //发送IPMSG_GETFILEDATA
fp = fopen("fileName", "w");
if( fp==NULL )
{
perror("savefile");
return -1;
}
len = 0;
do //接收文件
{
int rlen = recv(fd, buf, sizeof(buf), 0);
len += rlen;
printf("\rrecvlen=%d%%", (int)((100*len)/file_size));
fflush(stdout);
fwrite(buf, 1, rlen, fp);
}while(len < file_size);
printf("\n");
close(fd); //关闭TCP Client
fclose(fp); //关闭文件
return 0;
}
void tcp_sendfile(void)
{
int fd = tcp_fd(); //获取TCP_Server套接口描述符
struct sockaddr_in addr = {AF_INET};
unsigned int addrlen = sizeof(addr);
int clifd = 0;
int file_size=10;
clifd=accept(fd, (struct sockaddr*)&addr, &addrlen);
if( clifd<0 )
{
perror("accept");
return;
}
while(1)
{
char buf[1400]="";
FILE *fp = NULL;
int sendsize = 0;
//接收IPMSG_GETFILEDATA
if(recv(clifd, buf, sizeof(buf), 0)==0) break;
if( (fp=fopen("fileName", "r"))==NULL )
{
printf("senderror: no such file: %s\n", "fileName");
return ;
}
do //发送文件
{
int size = fread(buf, 1, sizeof(buf), fp);
send(clifd, buf, size, 0);
sendsize += size;
}while(sendsize < file_size);
fclose(fp); //关闭文件
}// 循环发送多个文件
close(clifd); //关闭套接口等待下个用户连接
return;
}
void main()
{
struct sockaddr_in addr = {AF_INET};
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
printf("cread udp client start...\n");
udp_create_server();
while(1)
{
udp_send_boardcast();
sleep(15);
udp_recv_msg(&addr);//阻塞
udp_msg_send("client udp ",strlen("client udp "),addr);
}
printf("end of main\n");
}