您的位置:首页 > 运维架构 > Linux

linux-socket通信示例(传送文件)

2009-09-01 22:46 399 查看
linux-socket通信示例(传送文件)

http://blog.csdn.net/hwz119/archive/2007/05/11/1604961.aspx

服务器端代码:
#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);
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: