linux與windows之間的socket編程



這篇博文可不是爲了講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很簡單


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章