日期:2014-05-17  浏览次数:20754 次

windows 下socket 实现服务器和客户端连接的小例子
// 服务器端实现代码

#include <WinSock.h>
#include <iostream>

using namespace std;

#define MAX_NAMEBUF 255
#define MAX_BUF		1024

// 网络链接库
#pragma comment( lib , "ws2_32.lib")

void socketInit2()
{
	// Windows异步套接字)的启动命令
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL
	{ 
		printf("Winsock无法初始化!\n");
		WSACleanup();
		return;
	}

	int sockfd,new_fd;
	struct sockaddr_in my_addr;
	struct sockaddr_in their_addr;
	int sin_size;


	//建立TCP套接口
	if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
	{
		printf("create socket error\n");
		perror("socket");
		exit(1);
	}

	//初始化结构体,并绑定2323端口
	my_addr.sin_family = AF_INET;
	my_addr.sin_port = htons(2323);
	my_addr.sin_addr.s_addr = INADDR_ANY;
	memset(my_addr.sin_zero, 0, 8);

	//绑定套接口
	if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
	{
		perror("bind socket error");
		exit(1);
	}

	//创建监听套接口
	if(listen(sockfd,10)==-1)
	{
		perror("listen");
		exit(1);
	}

	//等待连接
	while(1)
	{
		sin_size = sizeof(struct sockaddr_in);

		printf("server is run.\n");
		//如果建立连接,将产生一个全新的套接字
		if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1)
		{
			perror("accept");
			exit(1);
		}
		printf("accept success.\n");

		//读取客户端发来的信息
		int numbytes;
		char buff[256];
		memset(buff,0,256);
		if((numbytes = recv(new_fd,buff,sizeof(buff),0))==-1)
		{
			perror("recv");
			exit(1);
		}

		printf("%s\n",buff);
		//将从客户端接收到的信息再发回客户端
		if(send(new_fd,buff,strlen(buff),0)==-1)
		{
			perror("send");
			closesocket(new_fd);
			exit(0);
		}
		closesocket(new_fd);
	}

	closesocket(sockfd);
}

int _tmain(int argc, _TCHAR* argv[])
{
	socketInit2();
	return 0;
}

// 客户端实现代码

#include <stdio.h>
#include <stdlib.h>

#include <string.h>
#include <sys/types.h>

#include <WinSock2.h>
#include <iostream>

// 网络链接库
#pragma comment( lib , "ws2_32.lib")

int main(int argc,char *argv[])
{
	// Windows异步套接字)的启动命令
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL
	{ 
		printf("Winsock无法初始化!\n");
		WSACleanup();
		return 0;
	}

	int sockfd,numbytes;
	char buf[100];

	struct sockaddr_in their_addr;

	//建立一个TCP套接口
	if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
	{
		perror("socket");
		printf("create socket error.建立一个TCP套接口失败");
		exit(1);
	}
	//初始化结构体,连接到服务器的2323端口
	their_addr.sin_family = AF_INET;
	their_addr.sin_port = htons(2323);

	hostent	*pEnt;
	char hostname[256];
	::gethostname(hostname, sizeof(hostname));
	if ((pEnt = ::gethostbyname(hostname)) != NULL)
	{
		ULONG ad = *(ULONG *)pEnt->h_addr_list[0];
		their_addr.sin_addr.s_addr = ad;
		std::cout<<ad<<std::endl;
	}

	memset(their_addr.sin_zero,0,8);

	//和服务器建立连接
	if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==-1)
	{
		perror("connect");
		exit(1);
	}
	//向服务器发送数据
	if(send(sockfd,"hello!socket.",16,0)==-1)
	{
		perror("send");
		exit(1);
	}
	//接受从服务器返回的信息
	if((numbytes = recv(sockfd,buf,100,0))==-1)
	{
		perror("recv");
		exit(1);
	}
	buf[numbytes] = '\0';
	printf("Recive from server:%s\n",buf);

	//关闭socket
	closesocket(sockfd);

	getchar();
}