#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*