服务器的编写相对来说就是按照常规的方法,使用recv、send等函数进行接收数据、处理数据、回射数据的操作。
具体还是直接贴上代码吧:!!!
// 回显服务器1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <string.h>
#pragma comment(lib,"wsock32.lib")
#define SERVERPROT 6000
#define MAXSIZE 100
int _tmain(int argc, _TCHAR* argv[])
{
//初始化WinSock
WSADATA wsaData;
int ret = WSAStartup(MAKEWORD(2,2),&wsaData);
if(ret!=0)
{
printf("WSAStartup() failed!code:%d\n",WSAGetLastError());
return -1;
}
if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
printf("Invalid WinSock Version\n");
return -1;
}
//创建监听套接字
SOCKET slisten;
slisten = socket(AF_INET,SOCK_STREAM,0);
if(slisten == INVALID_SOCKET)
{
printf("socket() failed!code:%d\n",WSAGetLastError());
WSACleanup();
return -1;
}
//构建服务器本地地址信息
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(SERVERPROT);
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//绑定
ret = bind(slisten,(sockaddr*)&serveraddr,sizeof(serveraddr));
if(ret == SOCKET_ERROR)
{
printf("bind() failed!code:%d\n",WSAGetLastError());
closesocket(slisten);
WSACleanup();
return -1;
}
//侦听连接请求
ret = listen(slisten,5);
if(ret == SOCKET_ERROR)
{
printf("listen() failed!code:%d\n",WSAGetLastError());
closesocket(slisten);
WSACleanup();
return -1;
}
printf("waiting for client connecting...\n");
//接收客户端连接
struct sockaddr_in clientaddr;
int clientaddrlen = sizeof(clientaddr);
SOCKET sServer;//连接套接字
char buff[MAXSIZE];
char sendbuf[MAXSIZE];
sServer = accept(slisten,(struct sockaddr*)&clientaddr,&clientaddrlen);
if(sServer == INVALID_SOCKET)
{
printf("accept() failed!code:%d\n",WSAGetLastError());
closesocket(slisten);
WSACleanup();
return -1;
}
while(TRUE)
{
ret = recv(sServer,buff,MAXSIZE,0);
if(ret==SOCKET_ERROR)
{
int nErrCode = WSAGetLastError();//错误代码
if (WSAENOTCONN == nErrCode)
{
printf("The socket is not connected!\n");
}else if(WSAESHUTDOWN == nErrCode)
{
printf("The socket has been shut down!\n");
}else if (WSAETIMEDOUT == nErrCode)
{
printf("The connection has been dropped!\n");
}else if (WSAECONNRESET == nErrCode)
{
printf("The virtual circuit was reset by the remote side!\n");
}else{}
closesocket(sServer);
closesocket(slisten);
WSACleanup();
return -1;
}
sprintf(sendbuf,"echo:%s",buff);
printf("%s\n",sendbuf);
ret = send(sServer,sendbuf,strlen(sendbuf),0);
if (SOCKET_ERROR == ret)
{
int nErrCode = WSAGetLastError();//错误代码
if (WSAENOTCONN == nErrCode)
{
printf("The socket is not connected!\n");
}else if(WSAESHUTDOWN == nErrCode)
{
printf("The socket has been shut down!\n");
}else if (WSAETIMEDOUT == nErrCode)
{
printf("The connection has been dropped!\n");
}else{}
closesocket(sServer);
closesocket(slisten);
WSACleanup();
return -1;
}
}
return 0;
}
/********************************************************
/*函数作用:接收一行数据
/*参数说明:连接套接字、接收缓存
/*返回值:成功返回TRUE,失败返回FALSE
/********************************************************/
/*BOOL recvline(SOCKET S,char* buf)
{
BOOL retval = TRUE; //返回值
BOOL bLineEnd = FALSE;//一行读取结束
int nReadLen = 0; //读入字节数
int nDataLen = 0; //数据长度
while(!bLineEnd)
{
nReadLen = recv(S,buf+nDataLen,MAXSIZE,0);
if(nReadLen == SOCKET_ERROR)
{
int nErrCode = WSAGetLastError(); // 获取错误代码
if(WSAENOTCONN == nErrCode)
{
printf("套接字没有连接\n");
} else if(WSAESHUTDOWN == nErrCode)
{
printf("套接字已经关闭\n");
} else if(WSAETIMEDOUT == nErrCode)
{
printf("请求超时,主机没有反应\n");
} else if(WSAECONNRESET == nErrCode)
{
printf("远程主机强迫关闭了现有的连接\n");
} else {}
retval = FALSE; // 读取数据失败
break; // 跳出循环
}
if(0==nReadLen)
{
retval = FALSE; //读取数据失败
break;
}
for(int i=0;i<sizeof(buf);i++)
{
if('\n' == *(buf+i))
{
bLineEnd = TRUE; //接收数据结束
}
else
{
nDataLen += nReadLen;
}
}
}
return retval;
}*/