回射程序(服务器)——客户接收一行数据

来源:互联网 发布:云计算公司排行榜 编辑:程序博客网 时间:2024/05/16 00:37

服务器的编写相对来说就是按照常规的方法,使用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 100int _tmain(int argc, _TCHAR* argv[]){//初始化WinSockWSADATA 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;}*/


0 0