• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            Beginning Winsock Programming - Simple TCP server

            Introduction

            The WinSock (Windows Sockets) API is a socket programming library for Microsoft Windows Operating Systems. It was originally based on Berkeley sockets. But several Microsoft specific changes were employed. In this article I shall attempt to introduce you to socket programming using WinSock, assuming that you have never done any kind of network programming on any Operating System.

            If you only have a single machine, then don't worry. You can still program WinSock. You can use the local loop-back address called localhost with the IP address 127.0.0.1. Thus if you have a TCP server running on your machine, a client program running on the same machine can connect to the server using this loop-back address.

            Simple TCP Server

            In this article I introduce you to WinSock through a simple TCP server, which we shall create step by step. But before we begin, there are a few things that you must do, so that we are truly ready for starting our WinSock program

            • Initially use the VC++ 6.0 App Wizard to create a Win32 console application.?
            • Remember to set the option to add support for MFC
            • Open the file stdafx.h and add the following line :- #include <winsock2.h>
            • Also #includeconio.h and iostream just after winsock2.h
            • Take Project-Settings-Link and add ws2_32.lib to the library modules list.

            The main function

            				int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
            {
                int nRetCode = 0;	
            	
                cout << "Press ESCAPE to terminate program\r\n";
                AfxBeginThread(ServerThread,0);
                while(_getch()!=27);
            	
                return nRetCode;
            }

            What we do in our main() is to start a thread and then loop a call to _getch(). _getch() simply waits till a key is pressed and returns the ASCII value of the character read. We loop till a value of 27 is returned, since 27 is the ASCII code for the ESCAPE key. You might be wondering that even if we press ESCAPE, the thread we started would still be active. Don't worry about that at all. When main() returns the process will terminate and the threads started by our main thread will also be abruptly terminated.

            The ServerThread function

            What I will do now is to list our ServerThread function and use code comments to explain what each relevant line of code does. Basically what our TCP server does is this. It listens on port 20248, which also happens to be my Code Project membership ID. Talk about coincidences. When a client connects, the server will send back a message to the client giving it's IP address and then close the connection and go back to accepting connections on port 20248. It will also print a line on the console where it's running that there was a connection from this particular IP address. All in all, an absolutely useless program, you might be thinking. In fact some of you might even think this is as useless as SNDREC32.EXE which comes with Windows. Cruel of those people I say.

            UINT  ServerThread(LPVOID pParam)
            {	
                cout << "Starting up TCP server\r\n";
            
                //A SOCKET is simply a typedef for an unsigned int.//In Unix, socket handles were just about same as file //handles which were again unsigned ints.//Since this cannot be entirely true under Windows//a new data type called SOCKET was defined.
                SOCKET server;
            
                //WSADATA is a struct that is filled up by the call //to WSAStartup
                WSADATA wsaData;
            
                //The sockaddr_in specifies the address of the socket//for TCP/IP sockets. Other protocols use similar structures.
                sockaddr_in local;
            
                //WSAStartup initializes the program for calling WinSock.//The first parameter specifies the highest version of the //WinSock specification, the program is allowed to use.int wsaret=WSAStartup(0x101,&wsaData);
            
                //WSAStartup returns zero on success.//If it fails we exit.if(wsaret!=0)
                {
                    return0;
                }
            
                //Now we populate the sockaddr_in structure
                local.sin_family=AF_INET; //Address family
                local.sin_addr.s_addr=INADDR_ANY; //Wild card IP address
                local.sin_port=htons((u_short)20248); //port to use//the socket function creates our SOCKET
                server=socket(AF_INET,SOCK_STREAM,0);
            
                //If the socket() function fails we exitif(server==INVALID_SOCKET)
                {
                    return0;
                }
            
                //bind links the socket we just created with the sockaddr_in //structure. Basically it connects the socket with //the local address and a specified port.//If it returns non-zero quit, as this indicates errorif(bind(server,(sockaddr*)&local,sizeof(local))!=0)
                {
                    return0;
                }
            
                //listen instructs the socket to listen for incoming //connections from clients. The second arg is the backlogif(listen(server,10)!=0)
                {
                    return0;
                }
            
                //we will need variables to hold the client socket.//thus we declare them here.
                SOCKET client;
                sockaddr_in from;
                int fromlen=sizeof(from);
            
                while(true)//we are looping endlessly
                {
                    char temp[512];
            
                    //accept() will accept an incoming//client connection
                    client=accept(server,
                        (struct sockaddr*)&from,&fromlen);
            		
                    sprintf(temp,"Your IP is %s\r\n",inet_ntoa(from.sin_addr));
            
                    //we simply send this string to the client
                    send(client,temp,strlen(temp),0);
                    cout << "Connection from " << inet_ntoa(from.sin_addr) <<"\r\n";
            		
                    //close the client socket
                    closesocket(client);
            
                }
            
                //closesocket() closes the socket and releases the socket descriptor
                closesocket(server);
            
                //originally this function probably had some use//currently this is just for backward compatibility//but it is safer to call it as I still believe some//implementations use this to terminate use of WS2_32.DLL 
                WSACleanup();
            
                return0;
            }

            Testing it out

            Run the server and use telnet to connect to port 20248 of the machine where the server is running. If you have it on the same machine connect to localhost.

            Sample Output

            We see this output on the server

            E:\work\Server\Debug>server
            Press ESCAPE to terminate program
            Starting up TCP server
            Connection from 203.200.100.122
            Connection from 127.0.0.1
            E:\work\Server\Debug>

            And this is what the client gets

            nish@sumida:~$ telnet 202.89.211.88 20248
            Trying 202.89.211.88...
            Connected to 202.89.211.88.
            Escape character is '^]'.
            Your IP is 203.200.100.122
            Connection closed by foreign host.
            nish@sumida:~$

            Conclusion

            Well, in this article you learned how to create a simple TCP server. In further articles I'll show you more stuff you can do with WinSock including creating a proper TCP client among other things. If anyone has problems with compiling the code, mail me and I shall send you a zipped project. Thank you.

            About Nishant Sivakumar



            Editor
            Site Builder
            Nish is a real nice guy living in Toronto who has been coding since 1990, when he was 13 years old. Originally from sunny Trivandrum in India, he has moved to Toronto so he can enjoy the cold winter and get to play in some snow.

            He works for The Code Project and is in charge of the MFC libraries Ultimate Toolbox, Ultimate Grid and Ultimate TCP/IP that are sold exclusively through The Code Project Storefront. He frequents the CP discussion forums when he is not coding, reading or writing. Nish hopes to visit at least three dozen countries before his human biological mechanism stops working (euphemism used to avoid the use of the d-word here). Oh btw, it must be mentioned that normally Nish is not inclined to speak about himself in the 3rd person.

            Nish has been a Microsoft Visual C++ MVP since October, 2002 - awfully nice of Microsoft, he thinks. He maintains an MVP tips and tricks web site - www.voidnish.com where you can find a consolidated list of his articles, writings and ideas on VC++, MFC, .NET and C++/CLI. Oh, and you might want to check out his blog on C++/CLI, MFC, .NET and a lot of other stuff - blog.voidnish.com

            Nish loves reading Science Fiction, P G Wodehouse and Agatha Christie, and also fancies himself to be a decent writer of sorts. He has authored a romantic comedy Summer Love and Some more Cricket as well as a programming book – Extending MFC applications with the .NET Framework.

            posted on 2006-04-18 17:41 楊粼波 閱讀(636) 評論(0)  編輯 收藏 引用 所屬分類: 文章收藏

            国内精品久久人妻互换| 久久久这里只有精品加勒比 | 国产精品女同一区二区久久| 久久av免费天堂小草播放| 久久亚洲av无码精品浪潮| 久久久久久精品久久久久| 久久久久一区二区三区| 久久中文字幕视频、最近更新| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 久久久一本精品99久久精品66 | 久久无码精品一区二区三区| 国内高清久久久久久| 色成年激情久久综合| 一本一本久久A久久综合精品| 国产精品一区二区久久精品无码| 亚洲国产精品无码久久| 老司机午夜网站国内精品久久久久久久久| 免费精品国产日韩热久久| 国产高潮久久免费观看| 精品久久久噜噜噜久久久| 狠狠精品久久久无码中文字幕| 亚洲午夜精品久久久久久人妖| 久久夜色精品国产噜噜亚洲AV| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久精品国产99久久香蕉| 91精品国产综合久久久久久| 精品久久久久久国产| 亚洲精品无码久久毛片| 久久99精品久久久久久齐齐| 久久精品国产亚洲一区二区| 色欲综合久久中文字幕网| 一本色道久久综合亚洲精品| 久久天天躁夜夜躁狠狠| 久久久久久久精品妇女99| 久久久久久久91精品免费观看 | 99久久免费国产特黄| 亚洲熟妇无码另类久久久| 亚洲精品无码专区久久久| 激情伊人五月天久久综合| 国产一久久香蕉国产线看观看| 99国产精品久久久久久久成人热|