Http://blog.csdn.net/zjsiva/article/details/5895087
Written by the producer, reference ///////////////////////////////////// /// // server: # include <stdio. h> # include <string. h ># include <winsock2.h> # pragma comment (Lib, "ws2_32.lib") # define int_server_port 6002 # define str_server_ip "127.0.0.1" # define int_databuffer_size 100 void main (void) {word dwversion = makeword (2, 2); wsadata; wsastartup (winsock_version, & wsadata); socket sockserver = socket (af_ine T, sock_stream, 0); If (invalid_socket = sockserver) {printf ("failed to create socket! /R/N "); wsacleanup (); return;} sockaddr_in addrserver; memset (& addrserver, 0, sizeof (sockaddr_in); addrserver. sin_family = af_inet; addrserver. sin_port = htons (int_server_port); addrserver. sin_addr.s_un.s_addr = htonl (inaddr_any); // addrserver. sin_addr.s_addr = htonl (inaddr_any); int iresult; bool breuseaddr = true; iresult = setsockopt (sockserver, sol_socket, so_reuseaddr, (char *) & breuseaddr, sizeof Seaddr); If (socket_error = iresult) {printf ("failed to set resueaddr socket! /R/N "); wsacleanup (); return;}/* unsigned long cmd = 1; iresult = ioctlsocket (sockserver, fionbio, & cmd ); */iresult = BIND (sockserver, (sockaddr *) & addrserver, sizeof (addrserver); If (socket_error = iresult) {printf ("failed to bind address! /R/N "); wsacleanup (); return;} If (0! = Listen (sockserver, 5) {printf ("failed to listen client! /R/N "); wsacleanup (); return;} uint I = 0; socket sockaccept; sockaddr_in addraccept; int iacceptlen = sizeof (addraccept); char szdatabuff [limit]; int irecvsize; sockaddr_in addrtemp; int itemplen; fd_set FD; fd_zero (& FD); fd_set (sockserver, & FD);/* timeval TM; TM. TV _sec = 0; TM. TV _usec = 1000; */printf ("start server... /R/N "); While (1) {fd_set fdold = FD; iresult = select (0, & fdold, Null, null,/* & TM */null); If (0 <= iresult) {for (I = 0; I <FD. fd_count; I ++) {If (fd_isset (FD. fd_array [I], & fdold) {// If the socket is a server, it receives the connection if (FD. fd_array [I] = sockserver) {memset (& addraccept, 0, sizeof (addrtemp); sockaccept = accept (sockserver, (sockaddr *) & addraccept, & iacceptlen ); if (invalid_socket! = Sockaccept) {fd_set (sockaccept, & FD); // fd_set (sockaccept, & fdold); printf ("% s: % d has connected server! /R/N ", inet_ntoa (addraccept. sin_addr), ntohs (addraccept. sin_port) ;}} else // non-server, receives data (because FD is a read dataset) {memset (szdatabuff, 0, int_databuffer_size); irecvsize = Recv (FD. fd_array [I], szdatabuff, int_databuffer_size, 0); memset (& addrtemp, 0, sizeof (addrtemp); itemplen = sizeof (addrtemp); getpeername (FD. fd_array [I], (sockaddr *) & addrtemp, & itemplen); If (socket_error = irecvsize) {closesocket (FD. fd_array [I]); f D_clr (FD. fd_array [I], & FD); I --; printf ("failed to Recv data, % s: % d errorcode: % d. /R/N ", inet_ntoa (addrtemp. sin_addr), ntohs (addrtemp. sin_port), wsagetlasterror (); continue;} If (0 = irecvsize) {// disable printf ("% s: % d has closed! /R/N ", inet_ntoa (addrtemp. sin_addr), ntohs (addrtemp. sin_port); closesocket (FD. fd_array [I]); fd_clr (FD. fd_array [I], & FD); I --;} If (0 <irecvsize) {// print the received data printf ("Recv % s: % d data: % S/R/N ", inet_ntoa (addrtemp. sin_addr), ntohs (addrtemp. sin_port), szdatabuff) ;}}}} else if (socket_error = iresult) {// wsacleanup (); // printf ("faild to select sockt in server! /R/N "); sleep (100) ;}} wsacleanup ();} //////////////////////////////////////// /// // client: # include <stdio. h> # include <string. h> # include <winsock2.h> # pragma comment (Lib, "ws2_32.lib ") # define int_server_port 6002 # define str_server_ip "127.0.0.1" # define limit 100 # define str_exit "exit" Void main (void) {wsadata; wsastartup (winsock_version, so wsadata); socket Ckclient = socket (af_inet, sock_stream, 0); If (invalid_socket = sockclient) {printf ("failed to create client! /R/N "); wsacleanup ();} sockaddr_in addrclient; addrclient. sin_addr.s_un.s_addr = inet_addr (str_server_ip); addrclient. sin_family = af_inet; addrclient. sin_port = htons (int_server_port); int iresult; iresult = connect (sockclient, (sockaddr *) & addrclient, sizeof (sockaddr_in); If (socket_error = iresult) {printf ("failed to connect server! /R/N "); wsacleanup (); return;} If (0! = Iresult) {int ierrorcode; ierrorcode = wsagetlasterror (); printf ("failed to connect server, error: % d. /R/N ", ierrorcode); wsacleanup (); return;} Char szdatabuffer [int_databuffer_size]; while (1) {memset (szdatabuffer, 0, int_databuffer_size ); scanf ("% s", szdatabuffer); If (0 = strcmp (szdatabuffer, str_exit) {printf ("the client has stopped! /R/N "); break;} else {if (1> send (sockclient, szdatabuffer, strlen (szdatabuffer), 0) {printf (" failed to send data! /R/N ") ;}} sleep (100);} closesocket (sockclient); wsacleanup ();}