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

    技术2022-05-19  18

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

    最新回复(0)