#ifndef _H_PUB_H_
#define _H_PUB_H_
#ifdef WIN
#include <WinSock2.h>
#else
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#define SOCKET int
#endif
void getfilename(const char * filename,char *name);
int send_work(const char *hostname,int port,const char *filename);
SOCKET socket_accept (SOCKET listen_st);
SOCKET socket_create(int port);
SOCKET socket_connect(const char * hostname,int port);
SOCKET init_socket();
int recv_work(int port);
#endif
#ifdef WIN
#include <WinSock2.h>
#else
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#define SOCKET int
#endif
#include <stdio.h>
#include "tcp_pub.h"
#define BUFSIZE 262144
void getfilename(const char * filename,char *name)
{
int len = strlen(filename);
int i;
for (i = (len -1);i >=0;i--)
{
if ((filename[i] == '\\') || (filename[i]) == '/')
{
break;
}
}
strcpy(name,&filename[i + 1]);
return ;
}
SOCKET init_socket()
{
#ifdef WIN
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData);
if (err != 0)
{
return -1;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return -1;
}
#endif
return 0;
}
SOCKET socket_connect(const char * hostname,int port)
{
if (init_socket() == -1)
return 0;
SOCKET st = socket(AF_INET,SOCK_STREAM,0);
if (st == 0)
return 0;
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(hostname);
if (connect(st,(struct sockaddr *)&addr,sizeof(addr)) == -1)
{
printf("connect to %s:%d failed %s\n",hostname,port,strerror(errno));
return 0;
} else
{
return st;
}
}
SOCKET socket_create(int port)
{
if (init_socket() == -1)
return 0;
SOCKET st = socket(AF_INET,SOCK_STREAM,0);
if (st == 0)
return 0;
#ifdef WIN
const char on =0;
#else
int on = 0;
#endif
if (setsockopt(st, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1)
{
printf("setsockopt failed %s\n", strerror(errno));
return EXIT_FAILURE;
}
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(st, (struct sockaddr *) &addr, sizeof(addr)) == -1)
{
printf("bind failed %s\n", strerror(errno));
return EXIT_FAILURE;
}
if (listen(st, 20) == -1)
{
printf("listen failed %s\n", strerror(errno));
return EXIT_FAILURE;
}
printf("listen %d success\n",port);
return st;
}
SOCKET socket_accept (SOCKET listen_st)
{
struct sockaddr_in client_addr;
#ifdef WIN
int len = 0;
#else
unsigned int len = 1;
#endif
len = sizeof(client_addr);
memset(&client_addr, 0,sizeof(client_addr));
SOCKET client_st = accept(listen_st,(struct sockaddr *)&client_addr,&len);
if (client_st == -1)
{
printf("accept failed %s\n",strerror(errno));
return 0;
}
else
{
printf("accept by %s\n",inet_ntoa(client_addr.sin_addr));
return client_st;
}
}
int send_work(const char *hostname,int port,const char *filename)
{
SOCKET st = socket_connect(hostname,port);
if (st == 0)
return 0;
FILE *fd = fopen(filename,"rb");
if (fd == NULL)
{
printf("open %s failed %s\n",filename,strerror(errno));
return 0;
}
char *buf = malloc(BUFSIZE);
memset(buf,0,BUFSIZE);
getfilename(filename,buf);
size_t rc = send(st,buf,strlen(buf),0);
if (rc <= 0)
{
if (rc < 0 )
printf("send failed %s\n",strerror(errno));
else
printf("socket disconnect\n");
} else
{
memset(buf,0,BUFSIZE);
if ((rc = recv(st, buf, BUFSIZE, 0))<= 0)
{
if (rc < 0)
printf("recv failed %s\n",strerror(errno));
else
printf("socket disconnect\n");
} else
{
if (strncmp(buf,"OK",2) ==0)
{
while (1)
{
memset(buf,0,BUFSIZE);
rc = fread(buf,1,BUFSIZE,fd);
if (rc <= 0)
{
if (rc < 0)
printf("send failed %s\n",strerror(errno));
break;
} else
{
rc = send(st,buf,rc,0);
if (rc <= 0)
{
if (rc < 0)
printf("send failed %s\n",strerror(errno));
else
printf("socket disconnect\n");
break;
}
}
}
}
}
}
fclose(fd);
free(buf);
#ifdef WIN
closesocket(st);
WSACleanup();
#else
close(st);
#endif
return 1;
}
int recv_work(int port)
{
SOCKET listen_st = socket_create(port);
if (listen_st == 0)
return 0;
SOCKET st = socket_accept(listen_st);
if (st == 0)
return 0;
char *buf = malloc(BUFSIZE);
FILE *fd = NULL;
memset(buf, 0,BUFSIZE);
size_t rc = recv(st,buf,BUFSIZE,0);
if (rc <= 0)
{
if (rc < 0)
printf("recv failed %s\n",strerror(errno));
else
printf("socket disconnen\n");
} else
{
printf("receiving %s\n",buf);
fd = fopen(buf,"wb");
if (fd == NULL)
{
printf("open %s failed %s\n",buf,strerror(errno));
} else
{
memset(buf,0,BUFSIZE);
strcpy(buf,"OK");
rc = send(st,buf,strlen(buf),0);
if (rc <= 0)
{
if (rc < 0)
printf("send failed %s",strerror(errno));
else
printf("socket disconnect\n");
}
while (1)
{
memset(buf,0,BUFSIZE);
rc = recv(st,buf,BUFSIZE,0);
if (rc <=0 )
{
if (rc < 0)
printf("recv failed %s\n",strerror(errno));
else
printf("socket disconnect\n");
break;
} else
{
fwrite(buf,1,rc,fd);
}
}
}
}
if (fd)
fclose(fd);
free(buf);
#ifdef WIN
closesocket(st);
closesocket(listen_st);
WSACleanup();
#else
close(st);
close(listen_st);
#endif
return 1;
}
#include <stdio.h>
#include <stdlib.h>
#include "tcp_pub.h"
int main(int arg, char *args[])
{
if (arg < 4)
{
printf("Usage: %s <host-ip> <host-port> <trans-filename>\n",args[0]);
return EXIT_FAILURE;
}
int iport = atoi(args[2]);
if (iport == 0)
{
printf("port %d is invalid\n",iport);
return EXIT_FAILURE;
}
printf("%s send begin\n",args[3]);
if (send_work(args[1],iport,args[3]) == 1)
printf("%s send success\n",args[3]);
else
printf("%s send fail\n",args[3]);
return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
#include "tcp_pub.h"
int main(int arg, char *args[])
{
if (arg < 2)
{
printf("Usage: %s <port> \n",args[0]);
return EXIT_FAILURE;
}
int iport = atoi(args[1]);
if (iport == 0)
{
printf("port %d is invalid\n",iport);
return EXIT_FAILURE;
}
printf("%s send begin\n",args[3]);
if (recv_work(iport) == 1)
printf("%s recv success\n",args[3]);
else
printf("%s recv fail\n",args[3]);
return EXIT_SUCCESS;
}
//Linxu_Makefile
.SUFFIXES:.c.o
CC=gcc
SERVERSRCS=tcp_server.c\
tcp_pub.c
CLIENTSRCS=tcp_client.c\
tcp_pub.c
SERVEROBJS=$(SERVERSRCS:.c=.o)
CLIENTOBJS=$(CLIENTSRCS:.c=.o)
SERVEREXEC=Tcp_server_lin
CLIENTEXEC=Tcp_client_lin
all:$(SERVEROBJS) $(CLIENTOBJS)
$(CC) -o $(CLIENTEXEC) $(CLIENTOBJS)
$(CC) -o $(SERVEREXEC) $(SERVEROBJS)
@echo '----------OK-----------'
.c.o:
$(CC) -Wall -o $@ -c $<
clean:
rm -f $(SERVEROBJS)
rm -f $(CLIENTOBJS)
rm -f core*
//Windows_Makefile
.SUFFIXES:.c.o
CC=gcc
SERVERSRCS=tcp_server.c\
tcp_pub.c
CLIENTSRCS=tcp_client.c\
tcp_pub.c
SERVEROBJS=$(SERVERSRCS:.c=.o)
CLIENTOBJS=$(CLIENTSRCS:.c=.o)
SERVEREXEC=Tcp_server_win.exe
CLIENTEXEC=Tcp_client_win.exe
all:$(SERVEROBJS) $(CLIENTOBJS)
$(CC) -static -o $(CLIENTEXEC) $(CLIENTOBJS) -lWs2_32
$(CC) -static -o $(SERVEREXEC) $(SERVEROBJS) -lWs2_32
@echo '----------OK-----------'
.c.o:
$(CC) -Wall -DWIN -o $@ -c $<
clean:
rm -f $(SERVEROBJS)
rm -f $(CLIENTOBJS)
rm -f core*