码迷,mamicode.com
首页 > Windows程序 > 详细

Winsocket通信测试

时间:2015-03-31 09:22:02      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:网络编程 socket tcpip

一、Winsocket用TCP协议来完成通信


①服务器的程序

// SocketSever.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib,"WS2_32.LIB")

#if DUBUG  
	#define AF_INET         2               /* internetwork: UDP, TCP, etc. */
	#define SOCK_STREAM     1               /* stream socket */
	#define SOCK_DGRAM      2               /* datagram socket */
	#define SOCK_RAW        3               /* raw-protocol interface */
	#define SOCK_RDM        4               /* reliably-delivered message */
	#define SOCK_SEQPACKET  5               /* sequenced packet stream */
	/*
	* Socket address, internet style.
	*/
	struct sockaddr_in {
			short   sin_family;
			u_short sin_port;
			struct  in_addr sin_addr;
			char    sin_zero[8];
	};
	typedef struct sockaddr_in SOCKADDR_IN; /* Microsoft Windows Extended data types */
	int bind(
		SOCKET s,
		const struct sockaddr FAR * name,
		int namelen
		);									/* INCL_WINSOCK_API_PROTOTYPES*/
	int listen(
		SOCKET s,
		int backlog
		);
#endif 

#define Port 3578
#define MaxSize 1024

SOCKADDR_IN addrSrv;
SOCKADDR_IN addrClient;
SOCKET sockSrv; //服务器

SOCKET sockConn;

//********************************************************************************************************/
//** 函数名 ** StartSock()
//**  输入  ** 无
//**  输出  ** 无
//**函数描述** 加载套接字
//********************************************************************************************************/
int SocketInit()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested=MAKEWORD(2,2);
	err = WSAStartup(wVersionRequested,&wsaData); //返回0,成功,否则就是错误码

	if (err!=0)
	{
		printf("WinSock DLL版本不足要求n");
		return 0;
	}

	if (LOBYTE(wsaData.wVersion)!=2||
		HIBYTE(wsaData.wVersion)!=2)
	{
		WSACleanup();
		return 0;
	}

	return 1;
}

//********************************************************************************************************/
//** 函数名 ** main()
//**  输入  ** 无
//**  输出  ** 无
//**函数描述** 主函数
//********************************************************************************************************/
int main()
{
 	if (SOCKET_ERROR ==SocketInit())
 	{
 		return -1;
 	}
	
	SOCKADDR_IN addrSrv;//存放本地地址信息的
	addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//htol将主机字节序long型转换为网络字节序
	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(6001);//htos用来将端口转换成字符,1024以上的数字即可
	
	//真正socket编程部分
	SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//面向连接的可靠性服务SOCK_STRAM
	bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//将socket绑定到相应地址和端口上
	listen(sockSrv,5);//等待队列中的最大长度为5
	printf("%s\n","Welcome,the Host is running!Now Wating for someone comes in!");

	SOCKADDR_IN addrClient;
	int iSend = 0;
	char sendBuf[MaxSize];
	char revBuf[MaxSize];

	int len=sizeof(SOCKADDR);

	while(1)			//循环监听客户端,永远不停止
	{
		sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//阻塞调用进程直至新的连接出现

		if(sockConn == INVALID_SOCKET)
		{
			printf("Accept Failed!\n");
			return -1;
		}

		sprintf(sendBuf,"Server IP is:%s",inet_ntoa(addrClient.sin_addr));//inet_nota函数是将字符转换成ip地址

		iSend = send(sockConn,sendBuf,strlen(sendBuf)+1,0);//服务器向客户端发送数据

		if(iSend == SOCKET_ERROR)
		{
			printf("send Failed!");
			break;
		}

		char recvBuf[100];
		recv(sockConn,recvBuf,100,0);//服务器从客户端接受数据
		printf("%s\n",recvBuf);
		closesocket(sockConn);//关闭socket
	}

	closesocket(sockConn);         //关闭套接字
	getchar();
	return 0;
}
②客户端的程序

<pre name="code" class="cpp">#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#include <string.h>

#pragma comment(lib,"WS2_32.LIB")

//********************************************************************************************************/
//** 函数名 ** StartSock()
//**  输入  ** 无
//**  输出  ** 无
//**函数描述** 加载套接字
//********************************************************************************************************/
int SocketInit()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested=MAKEWORD(2,2);
	err = WSAStartup(wVersionRequested,&wsaData); //返回0,成功,否则就是错误码

	if (err!=0)
	{
		printf("WinSock DLL版本不足要求n");
		return 0;
	}

	if (LOBYTE(wsaData.wVersion)!=2||
		HIBYTE(wsaData.wVersion)!=2)
	{
		WSACleanup();
		return 0;
	}

	return 1;
}

//********************************************************************************************************/
//** 函数名 ** main()
//**  输入  ** 无
//**  输出  ** 无
//**函数描述** 主函数
//********************************************************************************************************/
int main()
{
    //固定格式
    char recvBuf[1024];
	
	if (SOCKET_ERROR ==SocketInit())
 	{
 		return -1;
 	}
    //建立通讯socket
    SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.100");//设定需要连接的服务器的ip地址
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(6001);//设定需要连接的服务器的端口地址
    connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//与服务器进行连接

    //接受来自老师的信息
  
	int iRevLen = 0;
    iRevLen = recv(sockClient,recvBuf,strlen(recvBuf)+1,0);
	if(0 == iRevLen)
	{
		return -1;
	}
	else if(SOCKET_ERROR == iRevLen)
	{
		printf("Recv Failed\n!");
		return -1;
	}
    printf("%s\n",recvBuf);

	char str[100];
	gets(str);
    send(sockClient,str,strlen(str)+1,0);

	closesocket(sockClient);
    WSACleanup();
	getchar();
	return -1;
}



Winsocket通信测试

标签:网络编程 socket tcpip

原文地址:http://blog.csdn.net/xy010902100449/article/details/44754511

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!