📄 socket_server.c
字号:
/* Exam:测试c/s模式的功能*/#include <stdio.h>#include <fcntl.h>#include <netinet/in.h>#include <arpa/inet.h>#include <sys/types.h>#include <sys/socket.h>#include <string.h>static void err_dump(char *) ;static int sockfd ; /* 后台原始的socket_fd */static int newsockfd ; /* 后台创建用来与前台通信的 */#define SERV_TCP_PORT 6000 /* 定义服务器的PORT端口 */#define MAXDL 10 /* 建立最大的请求队列的个数 */#define maxnum 9999struct csjym { char jym[7] ; char wjm[21] ;}csjymm[15] ;void main(int argc, char *argv[]){ int client, n , num ; pid_t pid; FILE *fp, *fp1 ; char temp[100] , *cli_addr_str ; char up[maxnum], down[maxnum], jym[7]; ushort cli_port , flag ; struct sockaddr_in serv_addr, cli_addr ; bzero((char*)&cli_addr, sizeof(cli_addr)) ; bzero((char*)&serv_addr, sizeof(serv_addr)) ; for ( num= 0 ; num < 15 ; num++) { bzero(&csjymm[num] ,sizeof(struct csjym)) ; } if ( (fp1 = fopen("jym.txt", "r")) == NULL) { printf( "open File Error.\n" ) ; exit(1) ; } num = 0 ; while( fgets(temp,90,fp1) != NULL) { strncpy(csjymm[num].jym, temp , 6) ; printf("jym= %s" ,csjymm[num].jym); strncpy(csjymm[num].wjm, temp+6 , 20) ; csjymm[num].wjm[6]='\0' ; printf("wjm= %s\n" ,csjymm[num].wjm); num++ ; if ( num > 14 ) { break ; } } fclose(fp1) ; /* 建立socket文件描述符 */ if( (sockfd=socket(AF_INET, SOCK_STREAM, 0)) < 0 ) printf( "Socket Error.\n" ) ; /* 配置地址结构serv_addr */ /* 指明socket的数据传送端口地址 */ serv_addr.sin_family = AF_INET ; serv_addr.sin_addr.s_addr = htonl( INADDR_ANY ) ; serv_addr.sin_port = htons( SERV_TCP_PORT ) ; if( bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) < 0 ) { err_dump( "Server:Bind Error." ) ; exit( 1 ) ; } /* 接收前台发生的请求,并将请求输入到一个队列中 */ listen(sockfd, MAXDL) ; for ( ; ; ) { bzero(up,sizeof(up)) ; bzero(down,sizeof(down)) ; bzero(jym,sizeof(jym)) ; client = sizeof(cli_addr) ; newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr,\ &client) ; /* 等待客户进程的连接请求 */ if( newsockfd<0 ) { printf( "Server:Accept Error.\n" ) ; } if ( newsockfd >= 0 ) { pid = fork() ; if ( pid == 0 ) { /* 读入客户进程传送的数据 */ n = read(newsockfd, up, maxnum ) ; printf(" up = %s|%d",up,n) ; if ( n >= 0 ) { strncpy(jym, up, 6); jym[6] = '\0' ; printf("num1=%d, jym1 = %s\n",num,jym); for ( num=0 ; num < 15 ; num++) { printf("num2=%d, jym = %s\n",num,jym); flag = strncmp(jym, csjymm[num].jym,6) ; printf("num=%d, jym = %s\n",num,jym); if ( flag == 0 ) { printf("num=%d, csjymm[num].wjm = %s\n",num,csjymm[num].jym); break ; } } printf("num=%d, jym = %s\n",num,jym); if ( num < 15 ) { if ((fp=fopen(csjymm[num].wjm,"r"))==NULL) // if ((fp=fopen("cx.txt","r"))==NULL) { printf( "Read File %d|%s Error.\n", \ fp, csjymm[num].wjm ) ; strcpy(down,"888888|服务器端处理错误") ; } else { fgets(down,9999, fp ) ; fclose(fp) ; } }else{ strcpy(down,"999999|无此交易码") ; } }else{ strcpy(down,"888888|服务器端处理错误") ; } n = strlen(down) ; printf(" down = %s|%d",down,n) ; /* 发送回应信息 */ write(newsockfd, down, n) ; /* 关闭与前台的连接 */ close( newsockfd ) ; exit(0) ; }else if( pid > 0 ) { close( newsockfd ) ; } } }}void err_dump(char *string) { printf("%s\n", string) ; perror( "System Error Message:" ) ; close( sockfd ) ; return ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -