18,357
社区成员
发帖
与我相关
我的任务
分享
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#pragma comment(lib,"ws2_32")
#define _CRT_SECURE_NO_DEPRECATE
#define SRVIP_LENGTH 20
#define PORT_NUM 8090
#define TRANS_LENGTH 1024
struct FileInfoPack
{
bool flag;
DWORD filesize;
};
int cmp( const void *a , const void *b )
{
return *(char *)a - *(char *)b;
}
int SendData(SOCKET sock,char* filedata)
{
long sendbyte=0;
if(filedata!=NULL)
{
sendbyte=send(sock,filedata,strlen(filedata),0);
}
else
{
printf("No data sorted!");
return 0;
}
if(sendbyte!=SOCKET_ERROR)
{
return 1;
}
else
{
printf("Cannot send data!");
return 0;
}
}
int RecvData(SOCKET sock,char *data,DWORD filesize)
{
//recive the pack with fileinfo
char temp[TRANS_LENGTH]={0};
DWORD recvbyte=0,tempbyte=0;
char *filebuf=NULL;
filebuf=(char*)malloc(filesize+1);
if(NULL==filebuf)
{
printf("Cannot Allocation Space!");
return 0;//分配空间失败
}
memset(filebuf,0,filesize);//
while(recvbyte<filesize)
{
tempbyte=recv(sock,temp,strlen(temp),0);
if(tempbyte==strlen(temp))
{
recvbyte+=tempbyte;
strcat_s(filebuf,filesize,temp);
}
else if(tempbyte==0)
{
printf("Client quit!");
break;
}
else if(tempbyte==SOCKET_ERROR)
{
printf("Error in recv(),ERROR:d%\n",WSAGetLastError());
break;
}
}
if(recvbyte==filesize)
{
strcpy_s(data,filesize,filebuf);
free(filebuf);
filebuf=NULL;
return 1;
}
else
return 0;
}
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
SOCKADDR_IN socket_addr; //used in accept(,struct sockaddr FAR * addr,)
SOCKET srv_sock=-1,conn_sock; //a descriptor referencing the new socket returned
int WSA_state = 0; //keep the value returned by WSAStartup()
int conn_flag=0,error_num=0;
int len=sizeof(SOCKADDR);
wVersionRequested = MAKEWORD( 1, 1 );
WSA_state = WSAStartup(wVersionRequested, &wsaData );
if (WSA_state != 0 ){
error_num=WSAGetLastError();
printf("Unable to start winsock serve,ERROR:%d\n",error_num);
return;
}
//create a socket used to communicate
srv_sock = socket(AF_INET, SOCK_STREAM, 0);
//set parameters of srv_sock
socket_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
socket_addr.sin_family = AF_INET;
socket_addr.sin_port = htons(PORT_NUM);
conn_flag=bind(srv_sock, (sockaddr*)&socket_addr, sizeof(SOCKADDR));
if( SOCKET_ERROR == conn_flag){
error_num=WSAGetLastError();
printf("bind error!ERROR:%d\n",error_num);
closesocket(srv_sock);
WSACleanup();
return;
}
conn_flag=listen(srv_sock, 5);
if( SOCKET_ERROR == conn_flag ){
error_num=WSAGetLastError();
printf("listen error!ERROR:%d\n",error_num);
closesocket(srv_sock);
WSACleanup();
return;
}
conn_sock = accept(srv_sock, (struct sockaddr*)&socket_addr, &len);//listen the application of connecting,create and return a new Socket
if(INVALID_SOCKET == conn_sock) {
error_num=WSAGetLastError();
printf("listen error!ERROR:%d\n",error_num);
closesocket(srv_sock);
WSACleanup();
return;
}
printf("Serving!\n");
FileInfoPack pack;
int recvbyte=0,flag;
recvbyte=recv(conn_sock,(char*)&pack,sizeof(pack),0);
char* data=NULL;
data=(char*)malloc((pack.filesize+1)*(sizeof(char)));
flag=RecvData(conn_sock,data,pack.filesize);
if(flag!=0)
{
qsort(data,strlen(data),sizeof(data[0]),cmp);
}
else
{
printf("Fail recive data!");
closesocket(srv_sock);
closesocket(conn_sock);
WSACleanup();
return;
}
flag=SendData(conn_sock,data);
//get the result sorted by server
closesocket(srv_sock);
closesocket(conn_sock);
WSACleanup();
}int nRet = 0;
int nCount = 0;
int nLeft = ...;// 为总共将要接收的字节数
while(...)
{
nRet = recv(SOCKET, filebuf+nCount, MAX_COUNT, 0);
if(SOCKET_ERROR != nRet)
{
nLeft -= nRet;
nCount += nRet;
}
else
{
// Error
}
}