实验三 实时系统
實驗內容:
編寫程序,實現Linux下的socket編程
代碼:
#include <stdio.h>
?#include <sys/socket.h>
?#include <sys/types.h>
?#include <stdlib.h>
?#include <netinet/in.h>
?#include <errno.h>
?#include <string.h>
?#include <arpa/inet.h>
?#include <unistd.h>
?#define MAXLINE 1024
?int main(int argc,char **argv)
?{
?char *servInetAddr = "127.0.0.1";
?int socketfd;
?struct sockaddr_in sockaddr;
?char recvline[MAXLINE], sendline[MAXLINE];
?int n;
?printf(“inpute the message\n");
?if(argc != 2)
?{
?printf("client connect success \n");
?exit(0);
?}
?
?socketfd = socket(AF_INET,SOCK_STREAM,0);
?memset(&sockaddr,0,sizeof(sockaddr));
?sockaddr.sin_family = AF_INET;
?sockaddr.sin_port = htons(10004);
?inet_pton(AF_INET,servInetAddr,&sockaddr.sin_addr)
?if((connect(socketfd,(struct sockaddr*)&sockaddr,sizeof(sockaddr))) < 0 )
?{
?printf("connect error %s errno: %d\n",strerror(errno),errno);
?exit(0);
?}
?
?printf("send message to server\n");
?
?fgets(sendline,1024,stdin);
?
?if((send(socketfd,sendline,strlen(sendline),0)) < 0)
?{
?printf("send mes error: %s errno : %d",strerror(errno),errno);
?exit(0);
?}
?
?close(socketfd);
?printf("exit\n");
?exit(0);
?}
?
?
#include <stdio.h>
?#include <sys/socket.h>
?#include <sys/types.h>
?#include <string.h>
?#include <netinet/in.h>
?#include <stdlib.h>
?#include <errno.h>
?#include <unistd.h>
?#include <arpa/inet.h>
?
?#define MAXLINE 1024
?int main(int argc,char **argv)
?{
?int listenfd,connfd;
?struct sockaddr_in sockaddr;
?char buff[MAXLINE];
?int n;
?
?memset(&sockaddr,0,sizeof(sockaddr));
?
?sockaddr.sin_family = AF_INET;
?sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
?sockaddr.sin_port = htons(10004);
?
?listenfd = socket(AF_INET,SOCK_STREAM,0);
?
?bind(listenfd,(struct sockaddr *) &sockaddr,sizeof(sockaddr));
?
?listen(listenfd,1024);
?for(;;)
?{
?if((connfd = accept(listenfd,(struct sockaddr*)NULL,NULL))==-1)
?{
?printf("accpet socket error: %s errno :%d\n",strerror(errno),errno);
?continue;
?}
?
?n = recv(connfd,buff,MAXLINE,0);
?buff[n] = '\0';
?printf("recv msg from client:%s",buff);
?close(connfd);
?}
?close(listenfd);
?}
?
實現截圖:
二 多線程實現
實現代碼:
#include <netinet/in.h>??? // for sockaddr_in
#include <sys/types.h>??? // for socket
#include <sys/socket.h>??? // for socket
#include <stdio.h>??????? // for printf
#include <stdlib.h>??????? // for exit
#include <string.h>??????? // for bzero
#include <unistd.h>
/*
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
*/
#define HELLO_WORLD_SERVER_PORT??? 6666
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
#define FILE_WORDS_NUMBER 32
int wc_func(char *file_name);
int main(int argc, char **argv)
{
??? //設置一個socket地址結構server_addr,代表服務器internet地址, 端口
??? struct sockaddr_in server_addr;
??? bzero(&server_addr,sizeof(server_addr)); //把一段內存區的內容全部設置為0
??? server_addr.sin_family = AF_INET;
??? server_addr.sin_addr.s_addr = htons(INADDR_ANY);
??? server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
?
??? //創建用于internet的流協議(TCP)socket,用server_socket代表服務器socket
??? int server_socket = socket(PF_INET,SOCK_STREAM,0);
??? if( server_socket < 0)
??? {
??????? printf("Create Socket Failed!");
??????? exit(1);
??? }
???
??? //把socket和socket地址結構聯系起來
??? if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
??? {
??????? printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
??????? exit(1);
??? }
???
??? //server_socket用于監聽
??? if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) )
??? {
??????? printf("Server Listen Failed!");
??????? exit(1);
??? }
??? while (1) //服務器端要一直運行
??? {
??????? //定義客戶端的socket地址結構client_addr
??????? struct sockaddr_in client_addr;
??????? socklen_t length = sizeof(client_addr);
?
??????? //接受一個到server_socket代表的socket的一個連接
??????? //如果沒有連接請求,就等待到有連接請求--這是accept函數的特性
??????? //accept函數返回一個新的socket,這個socket(new_server_socket)用于同連接到的客戶的通信
??????? //new_server_socket代表了服務器和客戶端之間的一個通信通道
??????? //accept函數把連接到的客戶端信息填寫到客戶端的socket地址結構client_addr中
??????? int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
??????? if ( new_server_socket < 0)
??????? {
??????????? printf("Server Accept Failed!\n");
??????????? break;
??????? }
???????
??? char file_name[FILE_NAME_MAX_SIZE+1];
??? bzero(file_name, FILE_NAME_MAX_SIZE+1);
??? char buffer[BUFFER_SIZE];
??? bzero(buffer,BUFFER_SIZE);
??? recv(new_server_socket,file_name,BUFFER_SIZE,0);
???
???
??? FILE * fp = fopen(file_name,"w");
??? if(NULL == fp )
??? {
??????? printf("File:\t%s Can Not Open To Write\n", file_name);
??????? exit(1);
??? }
???
??? //從客戶端接收數據到buffer中
??? bzero(buffer,BUFFER_SIZE);
??? int len = 0;
??? while( len = recv(new_server_socket,buffer,BUFFER_SIZE,0))
??? {
????? ??if(len < 0)
??????? {
??????????? printf("Recieve Data From Client %s Failed!\n", argv[1]);
??????????? break;
??????? }
?
??????? int write_length = fwrite(buffer,sizeof(char),len,fp);
??????? if (write_length<len)
??????? {
??????????? printf("File:\t%s Write Failed\n", file_name);
??????????? break;
??????? }
??????? bzero(buffer,BUFFER_SIZE);???
??? }
??? printf("File:\t%s Transfer Finished!\n",file_name);
???
??? fclose(fp);
???
??? //關閉與客戶端的連接
??? close(new_server_socket);
??? }
??? //關閉監聽用的socket
??? close(server_socket);
??? return 0;
}
?
#include <netinet/in.h>??? // for sockaddr_in
#include <sys/types.h>??? // for socket
#include <sys/socket.h>??? // for socket
#include <stdio.h>??????? // for printf
#include <stdlib.h>??????? // for exit
#include <string.h>??????? // for bzero
#include <unistd.h>
/*
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
*/
?
#define HELLO_WORLD_SERVER_PORT??? 6666
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
#define FILE_WORDS_NUMBER 32
int main(int argc, char **argv)
{
??? if (argc != 2)
??? {
??????? printf("Usage: ./%s ServerIPAddress\n",argv[0]);
??????? exit(1);
??? }
?
??? //設置一個socket地址結構client_addr,代表客戶機internet地址, 端口
??? struct sockaddr_in client_addr;
??? bzero(&client_addr,sizeof(client_addr)); //把一段內存區的內容全部設置為0
??? client_addr.sin_family = AF_INET;??? //internet協議族
??? client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自動獲取本機地址
??? client_addr.sin_port = htons(0);??? //0表示讓系統自動分配一個空閑端口
??? //創建用于internet的流協議(TCP)socket,用client_socket代表客戶機socket
??? int client_socket = socket(AF_INET,SOCK_STREAM,0);
??? if( client_socket < 0)
??? {
??????? printf("Create Socket Failed!\n");
??????? exit(1);
??? }
??? //把客戶機的socket和客戶機的socket地址結構聯系起來
??? if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))
??? {
??????? printf("Client Bind Port Failed!\n");
??????? exit(1);
??? }
?
??? //設置一個socket地址結構server_addr,代表服務器的internet地址, 端口
??? struct sockaddr_in server_addr;
??? bzero(&server_addr,sizeof(server_addr));
??? server_addr.sin_family = AF_INET;
??? if(inet_aton(argv[1],&server_addr.sin_addr) == 0) //服務器的IP地址來自程序的參數
??? {
??????? printf("Server IP Address Error!\n");
??????? exit(1);
??? }
??? server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
??? socklen_t server_addr_length = sizeof(server_addr);
??? //向服務器發起連接,連接成功后client_socket代表了客戶機和服務器的一個socket連接
??? if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0)
??? {
??????? printf("Can Not Connect To %s!\n",argv[1]);
??????? exit(1);
??? }
?
??? char file_name[FILE_NAME_MAX_SIZE+1];
??? bzero(file_name, FILE_NAME_MAX_SIZE+1);
??? printf("Please Input File Name On Server:\t");
??? scanf("%s", file_name);
???
??? char buffer[BUFFER_SIZE];
??? bzero(buffer,BUFFER_SIZE);
??? strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));
??? //向服務器發送buffer中的數據
??? send(client_socket,buffer,BUFFER_SIZE,0);
?
??? FILE * fp = fopen(file_name,"r");
??? if(NULL == fp )
??? {
??????? printf("File:\t%s Not Found\n", file_name);
??????? exit(1);
??? }
??? else
??? {
????? ??????bzero(buffer, BUFFER_SIZE);
??????????? int file_block_length = 0;
??????????? while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE, fp))>0)
??????????? {
??????????????? //printf("file_block_length = %d\n",file_block_length);
??????????????? //發送buffer中的字符串到服務器
??????????????? if(send(client_socket,buffer,file_block_length,0)<0)
??????????????? {
??????????????????? printf("Send File:\t%s Failed\n", file_name);
??????????????????? break;
??????????????? }
??????????????? bzero(buffer, BUFFER_SIZE);
??????????? }
??? }
???
??? printf("Send File:\t %s To Server[%s] Finished\n",file_name, argv[1]);
??????
??? printf("The File has %d words.\n", wc_func(file_name));
??? fclose(fp);
?
??? //關閉socket
??? close(client_socket);
??? return 0;
}
int wc_func(char *file_name)
{
?????? int t;
?????? int w = 0;
?????? int state = 0;
?????? FILE *in;
?????? if((in = fopen(file_name,"r"))==NULL)
?????? {
????????????? printf("wc %s:no this file or dir\n",file_name);
????????????? return;
?????? }
?????? while((t=fgetc(in))!=EOF)
?????? {
?????????????
????????????? if(t=='\n'||t==' '||t=='\r') {
??????????? ????????????? state = 0;
??????????? ????????????? continue;
??????? ?????? } else {
??????????? ????????????? if(state == 0) {
??????????????? ?????? state = 1;
??????????????? ?????? w++;
?????????? ???????? }
??????????? ????????????? continue;
??????? ?????? }
?????? }
?????? return w;
}
?
運行結果:
?
轉載于:https://www.cnblogs.com/x20165335/p/9977624.html
總結
- 上一篇: 算法题:找出整数数组中两个只出现一次的数
- 下一篇: 极路由安全设计架构分析