这篇博文可不是为了讲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很简单