⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serverside.cpp

📁 当客户端连接某端口的时候
💻 CPP
字号:
#include <stdio.h>
#include <winsock2.h>
#include <stdlib.h>
void	errexit(const char *, ...);
SOCKET passivesock(const char *service, const char *transport, int qlen);

#define	WINEPOCH	2208988800	/* Windows epoch, in UCT secs	*/
#define	WSVERS		      MAKEWORD(2, 0)

int main(int argc, char *argv[])
{
	struct sockaddr_in fsin;		/* the from address of a client	*/
	char	*service = "5080";		/* service name or port number	*/
	char	buf[2048];				/* "input" buffer; any size > 1 packet	*/
	SOCKET	sock, msock;			/* server socket		*/
	int	alen;						/* from-address length		*/
	WSADATA	wsadata;
	
	switch (argc) {
	case	1:
		break;
	case	2:
		service = argv[1];
		break;
	default:
		errexit("usage: UDPtimed [port]\n");
	}
	
	if (WSAStartup(WSVERS, &wsadata))
		errexit("WSAStartup failed\n");
	   msock = passivesock(service, "tcp", 0);;
	   alen = sizeof(fsin);
	   while(1)
	   {
		   sock = accept(msock, (struct sockaddr *)&fsin, &alen);
		   int cc;
		   cc = recv(sock,buf, sizeof(buf),0);
		   
		   if (cc == SOCKET_ERROR)
			   errexit("recvfrom: error %d\n", GetLastError());
		   closesocket(sock);
		   buf[cc+1]='\0';
		   printf("%s",buf);
	   }
	   
	   closesocket(msock);
	   return 1;	/* not reached */
}

u_short	portbase = 0;		/* port base, for test servers		*/
SOCKET passivesock(const char *service, const char *transport, int qlen)
{
	struct servent	*pse;	/* pointer to service information entry	*/
	struct protoent *ppe;	/* pointer to protocol information entry*/
	struct sockaddr_in sin;	/* an Internet endpoint address		*/
	SOCKET		s;	/* socket descriptor			*/
	int		type;	/* socket type (SOCK_STREAM, SOCK_DGRAM)*/
	
	memset(&sin, 0, sizeof(sin));
	sin.sin_family = AF_INET;
	sin.sin_addr.s_addr = INADDR_ANY;
	
    /* Map service name to port number */
	if ( pse = getservbyname(service, transport) )
		sin.sin_port = htons(ntohs((u_short)pse->s_port)
		+ portbase);
	else if ( (sin.sin_port = htons((u_short)atoi(service))) == 0 )
		errexit("can't get \"%s\" service entry\n", service);
	
    /* Map protocol name to protocol number */
	if ( (ppe = getprotobyname(transport)) == 0)
		errexit("can't get \"%s\" protocol entry\n", transport);
	
    /* Use protocol to choose a socket type */
	if (strcmp(transport, "udp") == 0)
		type = SOCK_DGRAM;
	else
		type = SOCK_STREAM;
	
    /* Allocate a socket */
	s = socket(PF_INET, type, ppe->p_proto);
	if (s == INVALID_SOCKET)
		errexit("can't create socket: %d\n", GetLastError());
	
    /* Bind the socket */
	if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR)
		errexit("can't bind to %s port: %d\n", service,
		GetLastError());
	if (type == SOCK_STREAM && listen(s, qlen) == SOCKET_ERROR)
		errexit("can't listen on %s port: %d\n", service,
		GetLastError());
	return s;
}

void errexit(const char *format, ...)
{
	va_list	args;
	va_start(args, format);
	vfprintf(stderr, format, args);
	va_end(args);
	WSACleanup();
	exit(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -