??? 近來一直忙著工作上的代碼,不難,就是很煩。寫習慣了C++,再寫C時,總覺得東一塊西一塊的,代碼寫的零零散散。于是將文件作為namespace,前綴作為class,總算能看明白了。。。。
??? 寫好,編譯時才發現沒有其他同事的代碼支持,就算編譯過了也沒法‘運行’自己的代碼,于是開始剝離代碼,一點點的拋開自己用不到代碼,終于可以用一個main(),可以跑起來了,卻又發現自己根本不會在目標機上調試,習慣了VCExpresss下的breakpoint后,去用printf(),那是沒法接受的。于是又準備將用到的library進行‘portable’處理,發現不可能。。。那些都是不能cross-platform的API,掙扎了很久,終于決定在windows上模擬實現用到的library,就是自己在windows上實現目標機上的library,如sharedmemory等。
??? 終于這一切都搞定了,widnows下編譯,鏈接,測試,好不痛快,雖然消耗了大量‘無用代碼’的時間,還好,我指法比較好,嘿嘿~
??? 但自己的代碼總要合成到系統中去的,在系統調試時,我一樣會變得無從下手的,于是又了現在的‘狠招’--添加一個‘telnet’到代碼中。。。。
??? 哇哈哈。。。有了telnet,一切盡在掌握在了~但,但,但。。。。才發現,自己不會寫socket了。。。丟臉,唉,被ACE慣壞了~
???
??? 說了一堆廢話,正題來了,下面的代碼是練習windows下的socket之作,很亂,沒有頭緒的,僅作代碼保留用~。

int?CC_Telnet_Create(const?char*?ip,?unsigned?short?port)


{
????int?i?=?-1;
????BOOL?flag?=?1;
????SOCKET?ls?=?0;
????SOCKET?as?=?0;
????SOCKET?cs[5];
????int?count?=?0;
????WSADATA?wsa;
????struct?sockaddr_in?addr;
????struct?timeval?val;
????fd_set?rd,?wd;
????int?ret?=?-1;

????ret?=?WSAStartup(MAKEWORD(2,?2),?&wsa);
????if(ret?!=?NO_ERROR)

????
{
????????printf("WSAStartup()?failed.\n");
????????return?-1;
????}
????
????ls??=?socket(AF_INET,?SOCK_STREAM,?IPPROTO_TCP);
????if(ls?==?INVALID_SOCKET)

????
{
????????WSACleanup();
????????printf("socket()?failed.\n");
????????return?-1;
????}

????
????if(ioctlsocket(ls,?FIONBIO,?&flag)?!=?0)

????
{
????????WSACleanup();
????????printf("socket()?failed.\n");
????????return?-1;
????}

????addr.sin_family?=?AF_INET;
????addr.sin_addr.s_addr?=?inet_addr(ip);
????addr.sin_port?=?htons(port);

????
????if(bind(ls,?(const?struct?sockaddr*)&addr,?sizeof(addr))?!=?0)

????
{
????????WSACleanup();
????????printf("bind()?failed.\n");
????????return?-1;
????}
????
????if(listen(ls,?SOMAXCONN)?!=?0)

????
{
????????WSACleanup();
????????printf("listen()?failed.\n");
????????return?-1;
????}


????val.tv_sec?=?0;
????val.tv_usec?=?100;
????while(1)

????
{
????????FD_ZERO(&rd);
????????FD_ZERO(&wd);

????????FD_SET(ls,?&rd);
????????FD_SET(ls,?&wd);

????????for(i?=?0;?i?<?count;?++?i)

????????
{
????????????FD_SET(cs[i],?&rd);
//????????????FD_SET(cs[1],?&wd);
????????}

????????ret?=?select(0,?&rd,?&wd,?NULL,?NULL);
????????if(ret?>?0)//?SOCKET_ERROR)

????????
{
????????????for(i?=?0;?i?<?count;?++?i)

????????????
{
????????????????if(FD_ISSET(cs[i],?&rd)?!=?0)

????????????????
{
????????????????????printf("cs?=?%d?in?rd.\n",?cs[i]);????????????????????
????????????????}
????????????????if(FD_ISSET(cs[i],?&wd)?!=?0)

????????????????
{
????????????????????printf("\ncs?=?%d?in?wd.\n",?cs[i]);
????????????????}
????????????}

????????????if(FD_ISSET(ls,?&rd)?!=?0)

????????????
{
????????????????as?=?accept(ls,?NULL,?NULL);
????????????????if(as?==?INVALID_SOCKET)

????????????????
{
????????????????????WSACleanup();
????????????????????printf("accept()?failed.\n");
????????????????????return?-1;
????????????????}
????????????????cs[count?++?]?=?as;
????????????????printf("accept?-?%d\n",?as);
????????????}
????????????if(FD_ISSET(ls,?&wd)?!=?0)

????????????
{
????????????????printf("wd\n");
????????????}
????????}
????????else

????????
{
????????????printf("erron?=?%d\n",?WSAGetLastError());
????????????break;
????????}
????}

????//?close?all?socket,?include?listen?socket

????closesocket(ls);

????WSACleanup();

????return?0;????
}??? 還好,雖然API不一樣,但流程或者叫做順序和BSD的一樣,寫起來除了需要msdn查看使用方法外,倒也不是很費勁。。。