📄 tcp.c
字号:
/******************************************************************************\ * tcp (Library) * ****************************************************************************** * Library for tcp. for win32 and Unix(BSD) * * auteur : Leto, @ngel$ * * date : 7-09-1999 *\******************************************************************************/// Leto's 1st steps in network programming.// server side code. + @ngel$ win32 add-ons...// Blux... win...#include "tcp.h"struct sockaddr_in srv_addr, cli_addr;int cli_addr_len = sizeof(srv_addr);int sSocket;char szerror[128];int nerror;char hostname[128];// start a server with x connections...int tcpstartsrv(int port, int nnoc){ // struct hostent *h_info; // initialisation de winsock... #ifdef WIN32 // winsock startup... WSADATA WSAData; // initializing in 1.1 mode... int nRc = WSAStartup(0x0101, &WSAData); // check initialization... if (nRc) { nerror = 1; sgeterror(); return -1; } // check version... if (WSAData.wVersion != 0x0101) { nerror = 2; sgeterror(); WSACleanup(); return -1; } #endif /* * Getting host IP is'nt necessary, because you want * to answer all requests not only the request for a particular * name of the host. // get host information if ( gethostname(hostname, sizeof(hostname))!= 0 ) { nerror = 5; sgeterror(); return -1; } // get host IP if ( (h_info=gethostbyname(hostname)) == 0) { nerror = 4; sgeterror(); return -1; } */ // open the socket... sSocket = socket(AF_INET, SOCK_STREAM, 0); // bind it to localhost... memset(&srv_addr, 0, sizeof(srv_addr)); srv_addr.sin_family = AF_INET; // addr = 0.0.0.0, it's fine. //memcpy( &srv_addr.sin_addr, h_info->h_addr_list[0], h_info->h_length); srv_addr.sin_port = htons((unsigned short)port); if ( bind(sSocket, (struct sockaddr *)&srv_addr, sizeof(srv_addr)) != 0 ) { nerror = 8; sgeterror(); close(sSocket); sSocket = -1; return -1; } // listening... listen(sSocket, nnoc); { int yes = 1; setsockopt(sSocket, IPPROTO_TCP, SO_REUSEADDR, (char*)&yes, sizeof(yes)); } return 0;} // end tcpstartserver// start a tcp Clientint tcpstartclient(int port, char* server){ struct hostent *h_info; // initialisation de winsock... #ifdef WIN32 // winsock startup... WSADATA WSAData; // initializing in 1.1 mode... int nRc = WSAStartup(0x0101, &WSAData); // check initialization... if (nRc) { nerror = 1; sgeterror(); return -1; } // check version... if (WSAData.wVersion != 0x0101) { nerror = 2; sgeterror(); WSACleanup(); return -1; } #endif // TODO add error code in case sSocket is not valide... // nerror = 3; sSocket = socket(AF_INET, SOCK_STREAM, 0); // get Host IP if ((h_info = gethostbyname(server)) == NULL) { nerror = 4; sgeterror(); return -1; } memset( &srv_addr, 0, sizeof(srv_addr)); srv_addr.sin_family = AF_INET; memcpy( &srv_addr.sin_addr.s_addr, h_info->h_addr_list[0], 4); srv_addr.sin_port = htons((unsigned short)port); if (connect(sSocket, (struct sockaddr *)&srv_addr, sizeof(srv_addr))!=0) { nerror = 7; sgeterror(); return -1; } return 0;} // end tcpstartclient// put error on the stdoutint geterror(){ if (!sgeterror()) { // known error printf("Error : %s\n", szerror); } else { printf("Unknown error : "); if (nerror != 0) { // unknown normal error printf("%x\n", nerror); } else { // in case of Non normal error #ifdef WIN32 printf("%x\n",WSAGetLastError()); return WSAGetLastError(); #else perror("perror"); #endif } } return nerror;} // end geterror()// String error Processing...int sgeterror(){ // Normal errors // TODO switch(nerror) { case 1 : sprintf(szerror, "Cannot initialize Winsock"); return 0; case 2 : sprintf(szerror, "Incompatible ver of Winsock"); return 0; case 3 : sprintf(szerror , "Impossible to start socket"); return 0; case 4 : sprintf(szerror , "Cannot resolve Hostname"); return 0; case 5 : sprintf(szerror, "Can't get server hostname"); return 0; case 6 : sprintf(szerror, "Can't bind socket to localhost"); return 0; case 7 : sprintf(szerror, "Can't connect"); return 0; case 8 : sprintf(szerror, "Can't start server (is another one running ?)"); return 0; //default : return -1; } // Windows WSA errors #ifdef WIN32 switch(WSAGetLastError()) { case WSANOTINITIALISED : sprintf(szerror, "WSANOTINITIALISED"); break; case WSAENETDOWN : sprintf(szerror, "WSAENETDOWN"); break; case WSAEADDRINUSE : sprintf(szerror, "WSAEADDRINUSE"); break; case WSAEINTR : sprintf(szerror, "WSAEINTR"); break; case WSAEINPROGRESS : sprintf(szerror, "WSAEINPROGRESS"); break; case WSAEALREADY : sprintf(szerror, "WSAEALREADY"); break; case WSAEINVAL : sprintf(szerror, "WSAEINVAL"); break; case WSAEADDRNOTAVAIL : sprintf(szerror, "WSAEADDRNOTAVAIL"); break; case WSAEAFNOSUPPORT : sprintf(szerror, "WSAEAFNOSUPPORT"); break; case WSAECONNREFUSED : sprintf(szerror, "WSAECONNREFUSED"); break; case WSAEFAULT : sprintf(szerror, "WSAEFAULT"); break; case WSAEISCONN : sprintf(szerror, "WSAEISCONN"); break; case WSAENETUNREACH : sprintf(szerror, "WSAENETUNREACH"); break; case WSAENOBUFS : sprintf(szerror, "WSAENOBUFS"); break; case WSAENOTSOCK : sprintf(szerror, "WSAENOTSOCK"); break; case WSAETIMEDOUT : sprintf(szerror, "WSAETIMEDOUT"); break; case WSAEWOULDBLOCK : sprintf(szerror, "WSAEWOULDBLOCK"); break; case WSAEACCES : sprintf(szerror, "WSAEACCES"); break; case WSAEMFILE : sprintf(szerror, "WSAEMFILE"); break; case WSAEOPNOTSUPP : sprintf(szerror, "WSAEOPNOTSUPP"); break; default: return -1; break; } return 0; #else return -1; #endif} // end sgeterror// close connectionint tcpstop(){ #ifdef WIN32 WSACleanup(); #else close(sSocket); #endif // TODO add close for the server sockets... return 0;} // end tcpstopint close_socket(int mySock){#ifdef WIN32 return closesocket(mySock);#else return close(mySock);#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -