📄 tcp_svr.cpp
字号:
/* TCP echo server to be run against Silicon Laboratories ETHERNET-DK in TCP echo client mode.
compile with: cl tcp_svr.cpp wsedesc.cpp wsock32.lib
PJB, 11/21/01, 12/14/01
*/
#include <stdio.h>
#include <winsock.h>
// Function prototype
int StreamServer(short nPort);
// Helper macro for displaying errors
LPCSTR WSErrorDescription(int);
#define PRINTERROR(s) \
fprintf(stderr,"\n%s: %s\n", s, WSErrorDescription(WSAGetLastError()))
////////////////////////////////////////////////////////////
void main(int argc, char **argv)
{
WORD wVersionRequested = MAKEWORD(1,1);
WSADATA wsaData;
int nRet;
short nPort;
nPort = 7; // well known echo port
// Initialize WinSock and check version
//
nRet = WSAStartup(wVersionRequested, &wsaData);
if (nRet != 0 || wsaData.wVersion != wVersionRequested)
{
fprintf(stderr,"\nError: wrong WinSock version\n");
return;
}
//
// Do the stuff a stream server does
//
do
{
nRet = StreamServer(nPort);
}
while (nRet == 0);
//
// Release WinSock
//
WSACleanup();
}
////////////////////////////////////////////////////////////
int StreamServer(short nPort)
{
//
// Create a TCP/IP stream socket to "listen" with
//
SOCKET listenSocket;
listenSocket = socket(AF_INET, // Address family
SOCK_STREAM, // Socket type
IPPROTO_TCP); // Protocol
if (listenSocket == INVALID_SOCKET)
{
PRINTERROR("socket()");
return (SOCKET_ERROR);
}
//
// Fill in the address structure
//
SOCKADDR_IN saServer;
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = INADDR_ANY; // Let WinSock supply address
saServer.sin_port = htons(nPort); // Use port from command line
//
// bind the name to the socket
//
int nRet;
nRet = bind(listenSocket, // Socket
(LPSOCKADDR)&saServer, // Our address
sizeof(struct sockaddr)); // Size of address structure
if (nRet == SOCKET_ERROR)
{
PRINTERROR("bind()");
closesocket(listenSocket);
return (nRet);
}
//
// print out where the server is waiting
//
int nLen;
nLen = sizeof(SOCKADDR);
char szBuf[1500];
nRet = gethostname(szBuf, sizeof(szBuf));
if (nRet == SOCKET_ERROR)
{
PRINTERROR("gethostname()");
closesocket(listenSocket);
return (nRet);
}
//
// Show the server name and port number
//
printf("\nTCP Echo Server %s is waiting...\n",szBuf);
//
// Set the socket to listen
//
nRet = listen(listenSocket, // Bound socket
SOMAXCONN); // Number of connection request queue
if (nRet == SOCKET_ERROR)
{
PRINTERROR("listen()");
closesocket(listenSocket);
return (nRet);
}
//
// Wait for an incoming request
//
SOCKET remoteSocket;
remoteSocket = accept(listenSocket, // Listening socket
NULL, // Optional client address
NULL);
if (remoteSocket == INVALID_SOCKET)
{
PRINTERROR("accept()");
closesocket(listenSocket);
return (SOCKET_ERROR);
}
//
// We're connected to a client
// New socket descriptor returned already
// has clients address
long lPacket = 0L;
//
// Receive data from the client
//
while (1)
{
memset(szBuf, 0, sizeof(szBuf));
nRet = recv(remoteSocket, // Connected client
szBuf, // Receive buffer
sizeof(szBuf), // Lenght of buffer
0); // Flags
if (nRet == SOCKET_ERROR)
{
PRINTERROR("recv()");
break;
}
else if (nRet == 0)
{
printf("Connection closed\n");
break;
}
//
// Display received data
//
++lPacket;
printf("\nReceived #%ld: %s",lPacket, szBuf);
//
// Send data back to the client
//
nRet = send(remoteSocket, // Connected socket
szBuf, // Data buffer
strlen(szBuf), // Lenght of data
0); // Flags
if (nRet == SOCKET_ERROR)
{
PRINTERROR("send()");
break;
}
}
//
// Close BOTH sockets before exiting
//
closesocket(remoteSocket);
closesocket(listenSocket);
return (nRet);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -