📄 server.c
字号:
/************************************* * SOCKET 连接服务端程序 * * 将收到的报文原样返回 * ************************************/#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <stdio.h>#include <stdlib.h>#define DATALEN 500int main(int argc, char **argv){ FILE *fp; int iRecvLen,iRead; struct protoent *pProtoent; struct sockaddr_in sin,sAddrIn; int sid,isSid,sType,iAddrLen; char cConnectIp[17],cDataBuf[DATALEN+1],cRecvFile[80]; if(argc!=3) { printf("Usage: %s 端口号 协议类型[1-UDP 0-TCP] \n",argv[0]); exit(-1); } /* 先配置参数 */ memset(&sin,0,sizeof(sin)); sin.sin_family=AF_INET; sin.sin_addr.s_addr=INADDR_ANY; if((sin.sin_port=htons((u_short)atoi(argv[1])))==0) { printf(" 开放端口有误 !\n"); exit(-1); } if (atoi(argv[2])) { if((pProtoent=getprotobyname("udp"))==0) { printf(" udp协议有误 !\n"); exit(-1); } sType=SOCK_DGRAM; } else { if((pProtoent=getprotobyname("tcp"))==0) { printf(" tcp协议有误 !\n"); exit(-1); } sType=SOCK_STREAM; } /* 建立 socket */ sid=socket(PF_INET,sType,pProtoent->p_proto); if(sid<0) { printf(" 建立socket失败!\n"); exit(-1); } printf(" socket建立成功!\n"); if (bind(sid,(struct sockaddr *)&sin,sizeof(sin))<0) { printf(" 绑定失败!\n"); exit(-1); } printf(" 绑定成功!\n"); if(listen(sid,25) < 0) { printf(" 建立侦听失败!\n"); exit(-1); } printf("Listening on port %s.......\n",argv[1]); while(1) { iAddrLen=sizeof(sAddrIn); if((isSid=accept(sid,(struct sockaddr *)&sAddrIn,&iAddrLen))<0) { printf("accept error !\n"); sleep(2); continue; } memset(cConnectIp,0,sizeof(cConnectIp)); strcpy(cConnectIp,inet_ntoa(sAddrIn.sin_addr)); printf(" 收到 %s 的连接\n",cConnectIp); memset(cDataBuf,0x0,sizeof(cDataBuf)); /* 先接收文件长度 */ if(recv(isSid,cDataBuf,8,0) <0) { printf(" 报文长度接收失败 !\n"); break; } iRecvLen = atoi(cDataBuf); sprintf(cRecvFile,"%s/tmp/test.txt",getenv("HOME")); if((fp=fopen(cRecvFile,"w"))==NULL) { printf(" 打开接收文件错 !\n"); break; } while(iRecvLen > 0) { iRead = recv(isSid,cDataBuf,1024,0); if(iRead < 0) { printf(" 数据报文接收失败 !\n"); break; } iRecvLen -=iRead; fwrite(cDataBuf,iRead,1,fp); } fclose(fp); strcpy(cDataBuf,"文件接收完成"); if(send(isSid,cDataBuf,strlen(cDataBuf),0)<0) { printf(" 数据报文发送失败 !\n"); break; } printf("发送成功,等待接收.....\n"); shutdown(isSid,2); close(isSid); } shutdown(isSid,2); close(isSid); shutdown(sid,2); close(sid); exit(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -