windows下简单的网络套接字编程

1.文件传输

通过建立服务器客户端连接,进行文件传输。由客户端输入一个文件名,服务器搜素,查找成功后,向客户端传输数据。客户端接受在当前目录下创建文件。

// hdksjfkl.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include "iostream"
#define  MAXSTRINGSIZE 9000
using namespace std;
#pragma  comment (lib,"ws2_32.lib")

//获取本机IP  
in_addr getHostName(void)   
{  
    char host_name[255];  
    //获取本地主机名称  
    if (gethostname(host_name, sizeof(host_name)) == SOCKET_ERROR) {  
        cout<<"Error %d when getting local host name."<<WSAGetLastError();  
        Sleep(3000);  
        exit(-1);  
    }  
	
    //从主机名数据库中得到对应的“IP”   
    struct hostent *phe = gethostbyname(host_name);  
    if (phe == 0) {  
        cout<<"Yow! Bad host lookup.";  
        Sleep(3000);  
        exit(-1);  
    }  
	
    struct in_addr addr;  
    memcpy(&addr, phe->h_addr_list[0], sizeof(struct in_addr));  
    return addr;   
}  


//启动服务器  
SOCKET StartServer(void)  
{  
    //创建套接字  
    SOCKET serverSocket;  
    if((serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){  
        cout<<"创建套接字失败!";  
        Sleep(3000);  
        exit(-1);  
    }  
    short port=1986;  
    struct sockaddr_in serverAddress;  
    //初始化指定的内存区域  
    memset(&serverAddress,0,sizeof(sockaddr_in));  
    serverAddress.sin_family=AF_INET;  
    serverAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  
    serverAddress.sin_port = htons(port);  
	
    //绑定  
    if(bind(serverSocket,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){  
        cout<<"套接字绑定到端口失败!端口:"<<port;  
        Sleep(3000);  
        exit(-1);  
    }  
	
    //进入侦听状态  
    if(listen(serverSocket,SOMAXCONN)==SOCKET_ERROR){  
        cout<<"侦听失败!";  
        Sleep(3000);  
        exit(-1);  
    }  
	
    //获取服务器IP  
    struct in_addr addr = getHostName();   
    cout<<"Server "<<inet_ntoa(addr)<<" : "<<port<<" is listening......"<<endl;  
    return serverSocket;  
}  
//接收客户端连接  
SOCKET ReceiveConnect(SOCKET &serverSocket)  
{  
	char SendBuffer[80] = {0};
	int bytes;
    SOCKET clientSocket;//用来和客户端通信的套接字  
    struct sockaddr_in clientAddress;//用来和客户端通信的套接字地址  
    memset(&clientAddress,0,sizeof(clientAddress));//初始化存放客户端信息的内存  
    int addrlen = sizeof(clientAddress);  
	
    //接受连接  
    if((clientSocket=accept(serverSocket,(sockaddr*)&clientAddress,&addrlen))==INVALID_SOCKET){  
        cout<<"接受客户端连接失败!";  
        Sleep(3000);  
        exit(-1);  
    }  
	cout<<"Accept connection from "<<inet_ntoa(clientAddress.sin_addr)<<endl;
	sprintf(SendBuffer,"200 welcome\r\n");  //向客户端发送欢迎消息
	bytes = send(clientSocket,SendBuffer,strlen(SendBuffer),0);
    return clientSocket;  
}  

void sendfile(SOCKET &serverSocket)
{
	while(1)
	{
		//接受客户端命令并调用处理函数
		FILE * fp = NULL;
		char buf[30];
		char senmm[10];
		memset(senmm,0,sizeof(senmm));
		char sendbuf[500];
		memset(sendbuf,1,sizeof(sendbuf));
		char maxbuf[500];
		memset(maxbuf,1,sizeof(maxbuf));	
		char sendmsg[50];
		memset(sendmsg,0,sizeof(sendmsg));
		SOCKET clientSocket = ReceiveConnect(serverSocket);
		do 
		{	
		memset(buf,1,sizeof(buf));
		int bytes = 0;
		if((bytes = recv(clientSocket,buf,strlen(buf)+1,0)) ==SOCKET_ERROR)
		{
			sprintf(sendmsg,"接收数据失败");
			send(clientSocket,sendmsg,strlen(sendmsg),0);
			break;
		}
		if((fp = fopen(buf,"r")) == NULL)
		{
		sprintf(senmm,"文件名错误");
		send(clientSocket,senmm,strlen(senmm)+1,0);
		printf("客户端发来的文件名没有\n");
		//printf("%d字节\n",bytes);
		}
		else
		{
			sprintf(senmm,"250");
			send(clientSocket,senmm, strlen(senmm) + 1,0);	
			printf("客户机发来文件下载请求,文件名如下%s\n",buf);
			break;
			Sleep(3000);
		}
		}while(1);
		Sleep(3000);
		char MMMM[1000];
		MMMM[0] = '\0';
		while(fgets(maxbuf,80,fp) != NULL)
		{
			//循环读取文件并通过h_NewSocket发送到客户端
			printf("%s\n",maxbuf);
		//	sprintf(sendbuf,"%s",maxbuf);
			strcat(MMMM,maxbuf);
			//send(clientSocket,maxbuf,strlen(maxbuf) + 1,0);
		//	printf(".");
		//	*/	printf("%s",sendbuf);
		}
		fclose(fp);
		printf("%s",MMMM);
		send(clientSocket,MMMM,strlen(MMMM) + 1,0);
		//sprintf(senmm,"266");
		//send(clientSocket,senmm,strlen(senmm) + 1,0);
		closesocket(clientSocket);
	}
}
int main(int argc, char* argv[])
{
	WSADATA wsa;
	if(WSAStartup(MAKEWORD(2,2),&wsa) != 0)
	{
		printf("套接字初始化失败!!\n");
		Sleep(3000);
		exit(-1);
	}
	SOCKET serverSocket = StartServer();
	sendfile(serverSocket);
	
	return 0;
}
以上是服务器段的代码。

// hdksjfklclien.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"  
#include <windows.h>  
#include <process.h>  
#include <iostream>  
#include "string.h"
using namespace std;  
#pragma comment(lib,"ws2_32.lib")  

//接收数据  
void Receive(SOCKET socket)  
{  
	
    char buf[2096];   
    int bytes;  
    if((bytes=recv(socket,buf,sizeof(buf),0))==SOCKET_ERROR){  
            printf("接收数据失败!\n");  
            exit(-1);  
        }  
        buf[bytes]='\0';  
        cout<<buf<<endl;   
}  

//获取服务器IP  
unsigned long GetServerIP(void)  
{  
    //把字符串的IP地址转化为u_long  
    char ipStr[20];  
    //用第二个参数填充第一个参数所指的内存,填充的长度为第三个参数的大小  
    memset(ipStr,0,sizeof(ipStr));  
	// cout<<"请输入你要链接的服务器IP:";  
	// cin>>ipStr;  
	strcpy(ipStr,"127.0.0.1");
    unsigned long ip;  
    if((ip=inet_addr(ipStr))==INADDR_NONE){  
        cout<<"不合法的IP地址:";  
        Sleep(3000);  
        exit(-1);  
    }  
    return ip;  
}  
//发送数据 
 char path[80] = {'0'};
void SendMsg(SOCKET &sock)  
{  
	
	printf("请输入要下载的文件名\n");
	scanf("%s",path);
	printf("%d\n",strlen(path));
        if(send(sock,path,strlen(path)+1,0)==SOCKET_ERROR)
		{  
            cout<<"发送数据失败!";  
            exit(-1);  
        }   
		cout<<"发送数据是"<<path<<endl;
}  
//链接服务器  
void CConnect(SOCKET &sock)  
{  
    unsigned long ip=GetServerIP();  
    //把端口号转化成整数  
    short port=1986;  
    cout<<"Connecting to "<<inet_ntoa(*(in_addr*)&ip)<<" : "<<port<<endl;  
    struct sockaddr_in serverAddress;  
    memset(&serverAddress,0,sizeof(sockaddr_in));  
    serverAddress.sin_family=AF_INET;  
    serverAddress.sin_addr.S_un.S_addr= ip;  
    serverAddress.sin_port = htons(port);  
    //建立和服务器的连接  
    if(connect(sock,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){  
        cout<<"建立连接失败:"<<WSAGetLastError();   
        Sleep(3000);  
        exit(-1);  
    }  
}  

int main(int argc, char* argv[])
{
	WSADATA wsa;  
    //初始化套接字DLL  
    if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){  
        cout<<"套接字初始化失败!";  
        Sleep(3000);  
        exit(-1);  
    }  
    
    //创建套接字  
    SOCKET sock;  
    if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){  
        cout<<"创建套接字失败!";  
        exit(-1);  
    }  
	
    CConnect(sock);//链接服务器  
	Receive(sock);
	char buf[10];	
	
	while(1)
	{
		if((strncmp(buf,"250",strlen("250") + 1) == 0))
		break;	
		SendMsg(sock);
		recv(sock,buf,strlen(buf) + 1,0);
			
	}
	FILE *fp;
	char recvbuf[1000];
	memset(recvbuf,1,sizeof(recvbuf));
	if((fp = fopen(path,"w+")) == NULL)
	{
		printf("本地打开文件错误\n");
		return 0;
	}
	//int bytee = 0;
	//printf("%s\n",recvbuf);
	 recv(sock,recvbuf,sizeof(recvbuf),0);
	 printf("%s",recvbuf);
	fprintf(fp,recvbuf);

	
	fclose(fp);
	closesocket(sock);
	WSACleanup();
	printf("文件接收完毕\n");
	return 0;
}

以上是客户端的代码。



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值