服务器端代码:
#include "creatSocket.h"
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <errno.h>
//#include "error.h"
#define BUFFSIZE 20
extern int errno;
main()
{
int temp_sock;
int ssock;
char buff[BUFFSIZE+1];
struct sockaddr_in pin;
int size_pin = sizeof(pin);
int count_receive ; /* count the receive world */
int fd; /* mark the file */
int count; /* count the number of reading */
ssock = passiveTCP("8000",5);
while(1)
{
printf("listen.../n");
temp_sock = accept(ssock,(struct sockaddr *)&pin,&size_pin);
count_receive = read(temp_sock,buff,BUFFSIZE);
printf("has receive message:%s/n",buff);
fd = open(buff,O_RDWR);
if(fd < 0)
errexit("can't open the file:%s/n",strerror(errno));
while(count = read(fd,buff,BUFFSIZE))
{
buff[count] = '/0';
printf("%s",buff);
write(temp_sock,buff,count);
}
close(temp_sock);
printf("the connect has closed!/n");
}
}
客户端代码:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include "error.h"
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
extern int errno;
#define BUFFSIZE 20
void menu();
void TCPclient();
void UDPclient();
main()
{
int c_choose;
while(1)
{
menu();
scanf("%d",&c_choose);
switch(c_choose)
{
case 1:TCPclient();break;
case 2:UDPclient();break;
default:exit(0);
}
}
}
void menu()
{
printf("Please choose the client:/n");
printf("1.TCPclient/n");
printf("2.UDPclient/n");
printf("3.exit/n");
printf("please input you choose:");
}
void UDPclient()
{}
void TCPclient()
{
char filename[20];
char buff[BUFFSIZE+1];
int count;
int port = 8000;
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(port);
int csock = socket(AF_INET,SOCK_STREAM,0);
if(connect(csock,(void *)&sin,sizeof(sin)))
errexit("has't connect to the server !:%s/n",strerror(errno));
else
printf("has connect to the server!/n");
printf("please input the file name:");
scanf("%s",buff);
write(csock,buff,sizeof(buff));
printf("the text content is :/n");
int i =0 ;
strcpy(filename,buff);
int fd = creat(filename,O_WRONLY|O_CREAT);
while(count = read(csock,buff,BUFFSIZE))
{
if(count < 0)
exit(0);
printf("%d,%d/n",i++,count);
buff[count] = '/0';
write(fd,buff,count);
printf("%s",buff);
memset(buff,0,sizeof(buff));
}
close(fd);
printf("the file %s has receive!/n",filename);
}
创建服务器端socket通用头文件:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <errno.h>
#include "error.h"
extern int errno;
unsigned short portbase = 0;
int passivesock(const char *service,const char *transport,int qlen)
{
struct servent *pse; //pointer to service information entry
struct protoent *ppe; //pointer to protocol information entry
struct sockaddr_in sin; //an Internet endpoint address
int s,type; //socket descriptor and socket type
memset(&sin,0,sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
//Map service name to port number
if( pse = getservbyname(service,transport))
sin.sin_port = htons(ntohs((unsigned short)pse->s_port)+portbase);
else if((sin.sin_port = htons((unsigned short)atoi(service))) == 0)
errexit("can't get /"%s/"service entry/n",service);
//Map protocol name to protocol number
if((ppe = getprotobyname(transport)) == 0)
errexit("can't get/"%s/"protocol entry/n",transport);
//Use protocol to choose a socket type
if(strcmp(transport,"udp") == 0)
type = SOCK_DGRAM;
else
type = SOCK_STREAM;
//Allocate a socket
s = socket(PF_INET,type,ppe->p_proto);
if(s <0 )
errexit("can't create socket :%s/n",strerror(errno));
//Bind the socket
if(bind(s,(struct sockaddr*)&sin,sizeof(sin)) < 0)
errexit("can't bind to %s port:%s/n",service,strerror(errno));
if(type == SOCK_STREAM && listen(s,qlen) < 0 )
errexit("can't listen on %s port:%s/n",service,strerror(errno));
return s;
}
int passiveUDP(const char*service)
{
return passivesock(service,"udp",0);
}
int passiveTCP(const char *service,int qlen)
{
return passivesock(service,"tcp",qlen);
}
错误处理头文件:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
int errexit(const char * format,...)
{
va_list args;
va_start(args,format);
vfprintf(stderr,format,args);
va_end(args);
exit(1);
}