簡單的客戶機服務器投射模擬

下面模擬了,簡單的客戶機服務器投射模擬的過程。客戶機像服務器發送數據,服務器接受到數據後,發送回給客戶機。再由客戶機打印出來。數組

須要的函數:

網絡方面服務器

服務器網絡

socket(AF_INET,SOCK_STREAM,0);  AF_INET表示IPV4,SOCK_STREAM表示基於字節流的,0表示協議由前面兩個參數組合而成。返回描述符 bind(sockdf,(struct sockaddr*)servaddr,sizeof(servaddr));   用於把描述符與本地協議地址聯繫起來。 listen(listenfd,1024);   監聽隊列,最多監聽1024個鏈接 accept(listenfd,(struct sockaddr *)&cliaddr,&clilen); 從完成隊列裏面取出套接字進行連接,若是沒有,則睡眠等待。 close(connfd);   關閉鏈接

客戶機socket

sockfd = socket(AF_INET,SOCK_STREAM,0); 與上面相同 connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); 向服務器發起鏈接,三次握手是在這裏觸發

IO方面tcp

fgets(sendline,MAXLINE,stdin);   從標準輸入中獲取數據寫入到sendline中,回車結束 fputs(recvline,stdout);   從緩衝區recvline中讀取數據寫入到stdout中 read(sockfd,recvline,MAXLINE);   從sockfd中讀入數據到recvline中 write(sockfd,sendline,strlen(sendline));   向sockfd中寫入sendline中的數據

服務器端代碼:

#include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #include <strings.h>
#define SERV_PORT 9877
#define LISTENQ 1024
#define MAXLINE 1024

int main(int argc,char ** argv){ int listenfd,connfd; pid_t childpid; socklen_t clilen; char buf[MAXLINE]; int n; struct sockaddr_in cliaddr,servaddr; listenfd = socket(AF_INET,SOCK_STREAM,0); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); listen(listenfd,LISTENQ); for( ; ; ){ clilen = sizeof(cliaddr); connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen); if((childpid = fork()) == 0){ close(listenfd); while((n=read(connfd,buf,MAXLINE)) > 0){ printf("from client:%s",buf); write(connfd,buf,n); int i=0; for(i=0;i<MAXLINE;i++){ buf[i] = '\0'; } } exit(0); } close(connfd); } }

客戶機端代碼:

#include <stdio.h> #include <stdlib.h> #include <netinet/in.h> #include <strings.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h>
#define MAXLINE 1024
int main(int argc, char const *argv[]) { int sockfd; struct sockaddr_in servaddr; char sendline[MAXLINE],recvline[MAXLINE]; if(argc != 2) printf("error! to clien IP\n"); sockfd = socket(AF_INET,SOCK_STREAM,0); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(9877); inet_pton(AF_INET,argv[1],&servaddr.sin_addr); connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); while(fgets(sendline,MAXLINE,stdin) != NULL){ write(sockfd,sendline,strlen(sendline)); //fflush(stdin);
 read(sockfd,recvline,MAXLINE); //printf("from server:%s\n", recvline);
 fputs(recvline,stdout); int i; for(i=0;i<MAXLINE;i++){ recvline[i] = '\0'; sendline[i] = '\0'; } } exit(0); }

因爲每次發送數據後,服務器端的buf,以及客戶機端的sendline recvline都有上次的舊數據,所以每次都進行一次賦值'\0',保證上次的數據不會對此次產生影響。函數

運行結果

在終端運行:spa

gcc -Wall -o serv serv.c ./serv

另開啓終端運行:code

gcc -Wall -o clien clie.c ./clie 127.0.0.1

此時在客戶機端發送數據server

[xingoo@localhost tcpip]$ ./clie 127.0.0.1 ffffff ffffff dd dd gg gg hello hello heiheieieihehi heiheieieihehi fdafdasfdasfdasfdasfdas fdafdasfdasfdasfdasfdas d d

服務器端接收blog

[xingoo@localhost tcpip]$ ./serv from client:ffffff from client:dd from client:gg from client:hello from client:heiheieieihehi from client:fdafdasfdasfdasfdasfdas from client:d
相關文章
相關標籤/搜索