天天看點

WIN32 socket程式設計

服務端

#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define  SVCPORT   12345

#pragma comment(lib, "Ws2_32.lib")
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
	//初始化socket程式設計環境
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested = MAKEWORD( 1, 1 );
	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) 
	{
		return 0;
	}
	if ( LOBYTE( wsaData.wVersion ) != 1 ||
		HIBYTE( wsaData.wVersion ) != 1 ) 
	{
		WSACleanup( );
		return 0; 
	}

	//建立Tcp伺服器socket
	SOCKET sockServer = socket(AF_INET, SOCK_STREAM, 0);

	//伺服器位址
	SOCKADDR_IN addServer;
	addServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY) ;
	addServer.sin_family = AF_INET ;
	addServer.sin_port = htons(SVCPORT) ;

	//将socket與位址綁定在一起
	int err = bind(sockServer, (SOCKADDR*)&addServer, sizeof(SOCKADDR));
	if ( SOCKET_ERROR == err )  
	{  
		cout<<"綁定失敗: "<< WSAGetLastError() << endl;  
		return 0;  
	} 
	//開始監聽用戶端請求,最大連接配接數為100
	listen(sockServer, 100);

	//用于存放用戶端位址
	SOCKADDR_IN addClient;
	int len = sizeof(SOCKADDR_IN);


	//不斷的接收用戶端請求socket
	SOCKET sockConn;
	cout << "接收用戶端請求...\n";
	sockConn = accept(sockServer, (SOCKADDR*)&addClient, &len);
	cout << "接收結束\n";

	//發送資料
	char sendBuf[100] ;
	memset(sendBuf, 0, 100);
	int r = 0;
	while (r != SOCKET_ERROR )	
	{
	
		sprintf( sendBuf , "歡迎%s連接配接上來:" , inet_ntoa(addClient.sin_addr) ) ;
		printf("服務端開始發送資料:%s...\n",sendBuf);
		r = send( sockConn , sendBuf , strlen(sendBuf)+1 , 0 ) ;




		//接收資料
		char recvBuf[100] ;
		printf("服務端接收資料...\n");
		r = recv( sockConn , recvBuf , 100 , 0 ) ;
		printf("服務端接收結束,接收到資料:%s...\n", recvBuf);
	}

	printf("連接配接失敗,程式退出\n");
	system("PAUSE");
	//關閉socket
	closesocket( sockConn ) ;
	//清理socket程式設計環境
	WSACleanup() ;

	return 0;
}
           

用戶端

#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

#pragma comment(lib, "Ws2_32.lib")
#define  SVCPORT   12345
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
	//初始化socket程式設計環境
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested = MAKEWORD( 1, 1 );
	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) 
	{
		return 0;
	}
	if ( LOBYTE( wsaData.wVersion ) != 1 ||
		HIBYTE( wsaData.wVersion ) != 1 ) 
	{
		WSACleanup( );
		return 0; 
	}

	//建立用戶端socket
	SOCKET socketClient = socket(AF_INET, SOCK_STREAM, 0);

	//伺服器位址
	SOCKADDR_IN addrServer;
	addrServer.sin_addr.S_un.S_addr = inet_addr("192.168.0.200");
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(SVCPORT);

	//連接配接伺服器

	//等待接收伺服器的響應
	char recvBuf[1000];
	memset(recvBuf, 0 , 1000);
	connect(socketClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
	int r = 0;
	while(r != SOCKET_ERROR)
	{
		cout << "開始接收...\n";
		r = recv( socketClient , recvBuf , 100 , 0 ) ;
		printf("---------------接收結束--------------\n");
		printf( "接收到來自伺服器的資料為: %s\n" , recvBuf ) ;




		char sendBuf[1000] ;
		printf("請輸入要發送的1000個字元的内容: ");
		gets(sendBuf);
		printf("發送資料中...\n");
		r = send( socketClient , sendBuf , strlen(sendBuf)+1 , 0 ) ;
		printf("發送完畢,等待伺服器接收\n");
		
	}
	
	printf("連接配接伺服器失敗! 程式将退出\n");
	system("PAUSE");
	closesocket( socketClient ) ;
	WSACleanup() ; 

	return 0;
}
           

繼續閱讀