?? server1.c
字號(hào):
/* Server1.c for Windows Developers Journal by Victor R. Volkman
* this code may be used freely with no restrictions on use
*
* To build Win32 server cl server1.c scompat.c /Z7 /MT
* To build Unix server cc server1.c scompat.c -o server1
*/
#include <stdio.h>
#include "scompat.h"
/* try to tell linker where WinSock library is */
#if defined(_MSC_VER)
# pragma comment(lib,"wsock32.lib")
#elif defined(__BORLANDC__)
# pragma comment(lib,"mswsock.lib")
#endif
#define WSA_ERROR(x) { printf("Error %d: %s\n", \
WSAGetLastError(), x); return 1; }
int ServerLoop(SOCKET sd_listen, int isMultiTasking);
main(int argc, char **argv)
{
SOCKET sd_listen;
int err;
u_short iPort;
struct sockaddr_in addr_srv;
struct hostent *ptrHost;
char *pszHost = "152.160.13.253";
iPort = (argc >= 2) ? atoi(argv[1]) : 9999;
InitSockets();
sd_listen = socket(PF_INET, SOCK_STREAM, 0);
if (sd_listen == INVALID_SOCKET) {
printf("Error: out of socket resources\n");
return 1;
}
if (atoi(pszHost)) {
u_long ip_addr = inet_addr(pszHost);
ptrHost = gethostbyaddr((char *)&ip_addr,
sizeof(u_long), AF_INET);
}
else
ptrHost = gethostbyname(pszHost);
if (!ptrHost)
WSA_ERROR("cannot resolve hostname")
addr_srv.sin_family = PF_INET;
addr_srv.sin_addr.s_addr = htonl(INADDR_ANY);
addr_srv.sin_port = htons(iPort);
err = bind(sd_listen, (const struct sockaddr *) &addr_srv,
sizeof(addr_srv));
if (err == INVALID_SOCKET)
WSA_ERROR("Error: unable to bind socket\n")
err = listen(sd_listen, SOMAXCONN);
if (err == INVALID_SOCKET)
WSA_ERROR("Error: listen failed\n")
ServerLoop(sd_listen, 1);
printf("Server is down\n");
WSACleanup();
return 0;
}
void ServeAClient(LPVOID lpv)
{
SOCKET sd_accept = (SOCKET) lpv;
const char *msg = "HELLO CLIENT";
char response[4096];
memset(response, 0, sizeof(response));
recv(sd_accept, response, sizeof(response), 0);
if (strcmp(response, "HELLO SERVER")) {
printf("Application: client not using expected "
"protocol %s\n", response);
}
else
send (sd_accept, msg, strlen(msg)+1, 0);
closesocket(sd_accept);
}
#define MAX_SERVED 3
int ServerLoop(SOCKET sd_listen, int isMultiTasking)
{
SOCKET sd_accept;
struct sockaddr_in addr_client;
int err, nSize;
int numServed = 0;
HANDLE handles[MAX_SERVED];
int myID;
while (numServed < MAX_SERVED) {
nSize = sizeof(addr_client);
sd_accept = accept(sd_listen, (struct sockaddr *)
&addr_client, &nSize);
if (sd_accept == INVALID_SOCKET)
WSA_ERROR("Error: accept failed\n")
printf("Accepted connection from client at %s\n",
inet_ntoa(addr_client.sin_addr));
if (isMultiTasking) {
#ifdef _WIN32
handles[numServed] = CreateThread(NULL, 1000,
(LPTHREAD_START_ROUTINE)ServeAClient,
(LPVOID) sd_accept, 0, &myID);
#else
myID = fork();
if (myID == 0) { /* I am child process */
ServeAClient ((LPVOID) sd_accept);
exit(0);
}
handles[numServed] = myID;
#endif
}
else
ServeAClient((LPVOID) sd_accept);
numServed++;
}
if (isMultiTasking) {
#ifdef _WIN32
err = WaitForMultipleObjects(MAX_SERVED, handles,
TRUE, INFINITE);
printf("Last thread to finish was thread #%d\n", err);
#endif
}
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -