這篇博文可不是爲了講socket編程的哦,socket只是一個工具被我使用而已。
從很久以後就在想,編程能幹什麼呢?後來纔想明白,編程是爲了解決問題的,給人一種方便。每次看着女朋友使用着他們的工程計算軟件的時候,我就會想起,這就是編程給予的好處,讓她擺脫了用手去計算建築工程...
可是作爲一個程序員我其實一直都沒有很好的體現出這一點,出現很多的問題的時候,總是都將就着過,猶如做一天和尚撞一天鐘,能將就就將就着過。其實有一句話說的好最好的程序員也就是最懶惰的程序員,能用計算機實現的何必需要人力去完成呢。所以做爲一個程序員我覺得首先你要有一種精神,就是什麼問題都能從自己開始出發,問自己能不能去解決這個問題,或者是嘗試去解決這個問題,使用計算機....
大學中我發現我缺乏這樣的一種精神,這讓我的水平一直處於中等,一直不能有所成長...我想我是缺少這種熱情和精神...我要改變這種狀況...爲此我再次爭取了在學校裏的學習....我相信我能改變的....
最近一直在學習linux的編程。環境是rhel 5,用虛擬機的形式裝着。VM 很強大,不過由於計算機的配置真的很低級,在VM中的rhel5有很多的限制,比如它的網速慢的要死,還有就是沒有配置中文等一系列的問題,讓我每次碰見問題Google的時候很鬱悶。作爲一個獨立的系統,linux與windows之間不能進行相互的copy,所以有時候在windows搜索linux中碰見的問題就是一件很麻煩的事情,因爲不能copy,弄的很多問題要自己去打。這一直讓我覺得很麻煩。以前的解決方法是使用linux 的samba這個服務(不知道這個名字對還是不對),哈哈,這個服務是可以讓windows通過網絡去訪問linux的fs,這樣好處真的很多,比如有時候linux中的vi沒有windows中的gvim用的那麼爽,那我就在windows中使用gvim寫程序,寫完以後就通過這個服務把程序copy到linux的某個目錄下。。。。我每次在Linux下創建一個文件,然後每次linux 的問題就copy到這個文件,然後通過samba這個服務讓windows去訪問這個文件,然後在進行copy。不過這還是一個很麻煩的過程....
不過一次在使用socket for linux的編程中,讓我突發奇想到如果我在Linux中運行server這個程序,然後在windows下運行client這個程序,那樣不是可以通信了嗎..哈哈哈,所以很想早點動手寫,不過一直懶的很,不過昨天還是花了點時間去寫這個程序。linux在的server程序本來就寫好了,可是windows下的client還沒寫,以前寫的是linux的client。不過想想之間的差不多肯定是不大的...所以昨天從網上找了點關於windows socket的資料,也進行了編寫。還是很順利的寫完這個client for windows的程序。windows的socket編程在大體上和Linux的還是差不多的,只是調用的一些函數會有點差別
Linux for server (code)
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<netdb.h> #include<sys/socket.h> #include<sys/types.h> #include<netinet/in.h> #include<unistd.h> #define PORT 3335 #define MAX_LEN 1024 typedef struct sockaddr_in addr; int main() { int sin_size = sizeof(addr); int sockid = 0; int new_sockid = 0; addr ser_addr,client_addr; char bufferw[MAX_LEN]; char bufferr[MAX_LEN]; //create socket if((sockid = socket(AF_INET,SOCK_STREAM,0)) == -1) { printf("create socket is failure\n"); exit(1); } //對ser_addr 進行初始化 bzero(&ser_addr,sizeof(addr)); ser_addr.sin_family = AF_INET; ser_addr.sin_port = htons(PORT); ser_addr.sin_addr.s_addr = htonl(INADDR_ANY); //server bind if((bind(sockid,(struct sockaddr *)&ser_addr,sizeof(ser_addr))) == -1) { fprintf(stderr,"bind error is %s\n",strerror(errno)); exit(1); } //listen if(listen(sockid,5) == -1) { fprintf(stderr,"listen error is %s\n",strerror(errno)); exit(1); } while(1) { //accept if((new_sockid = accept(sockid,(struct sockaddr*)(&client_addr),&sin_size)) == -1) { fprintf(stderr,"accept error is %s\n",strerror(errno)); exit(1); } else { printf("server and client %s link success!!\n",inet_ntoa(client_addr.sin_addr.s_addr)); } //進行讀寫 if(fork() == 0) { //在子進程中進行讀寫操作 while(1) { fgets(bufferw,MAX_LEN,stdin); if(write(new_sockid,bufferw,MAX_LEN) == -1) { fprintf(stderr,"write error is %s\n",strerror(errno)); exit(1); } if(strcmp(bufferw,"end\n") == 0) { printf("your talk is over!!\n"); break; } } close(new_sockid); } else { sleep(2); } } close(sockid); printf("server is over!!\n"); }
client for windows#pragma comment(lib,"wsock32.lib") #include<stdio.h> #include<winsock2.h> #define PORT 3335 #define MaxLen 1024 typedef struct sockaddr_in addr; int Initsocket(void); int Initsocket(void) { WSADATA wsadata; WORD version; int err; version = MAKEWORD(2,2); err = WSAStartup(version,&wsadata); if(err) { printf("Error %d:winsock not avaiable\n"); return 1; } return 0; } int main() { SOCKET client; int err; char bufferw[MaxLen]; char bufferr[MaxLen]; addr server_add; int i; Initsocket(); if((client = socket(PF_INET,SOCK_STREAM,0)) == INVALID_SOCKET) { printf("no more socket resource\n"); return 1; } //服務器地址的初始化 server_add.sin_family = PF_INET; server_add.sin_port = htons(PORT); server_add.sin_addr.S_un.S_addr= inet_addr("192.168.0.2"); if((err = connect(client,(struct sockaddr*)&server_add,sizeof(addr))) == INVALID_SOCKET) { printf("error %d:cannot connect to server\n"); return 1; } else { printf("link server is successful\n"); while(1) { recv(client,bufferw,sizeof(bufferw),0); printf("server said: %s\n",bufferw); if(strcmp(bufferw,"end\n") == 0) { break; } else { for(i = 0;bufferw[i] != '\0';i++) { bufferw[i] = '\0'; } } } } closesocket(client); WSACleanup(); return 0; }
這兩個程序都很簡單的...因爲我只要linux傳信息過來,所以在server中只是寫,在client中只是接收....這大概是第一次因爲自己想要方便才寫的程序,呵呵,覺得如果自己一直這樣努力下去應該會變成一個不錯的coder....很開心...
這裏還是要講一下,windows和Linux的編程我覺得Linux簡單的多,你看看我上面的寫的兩個程序就會發現windows下面寫程序有多少亂了。好多的東西是你不熟悉的...Linux的入手會難,那是因爲你一開始是使用windows,所以有點先入爲主的觀點...
如果有同感的話看看這篇文章把...我覺得寫得很是那麼回事-------其實Unix很簡單
linux與windows之間的socket編程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.