【网络编程】之四、socket网络编程例解

前面说了那么多,现在我们给出4个代码+详解,基于win32平台的socket编程。使用TCP  和  UDP  两种协议。


OK,先来看一下TCP服务器和客户端:

/**************************************************
文件名server.cpp
windows下socket网络编程实例  -- 服务器端基于TCP
服务器地址:'127.0.0.1'
端口号 8888
作者:peter
***************************************************/
#include<WinSock2.h>
#include<stdio.h>
#pragma comment(lib,"WS2_32.lib")

int main(int argc, char* argv[])
{
	WSADATA wsaData;
	WORD sockVersion = MAKEWORD(2,0);//指定版本号
	::WSAStartup(sockVersion, &wsaData);//载入winsock的dll
	//创建套接字基于TCP
	SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(s == INVALID_SOCKET)
	{
		printf("error");
		::WSACleanup();//清理,释放资源
		return 0;
	}

	sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(8888);//端口号8888
	sin.sin_addr.S_un.S_addr = INADDR_ANY;//地址全是0,也就是所有的地址
	//绑定socket
	if(::bind(s, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
	{
		printf("error");
		::WSACleanup();//清理释放资源
		return 0;
	}
	//监听socket
	if(::listen(s, 2) == SOCKET_ERROR)
	{
		printf("error");
		::WSACleanup();//释放资源
		return 0;
	}

	sockaddr_in remoteAddr;
	int nAddrLen = sizeof(remoteAddr);
	SOCKET client;
	char szText[] = "peter\n";//缓冲区数据

	while(1)
	{
		/*accept服务器端使用,调用函数进入阻塞状态,等待用户连接,如果没有客户端进行连接,程序就在这个地方。
			不会看到后面。如果有客户端连接,那么程序就执行一次然后继续循环到这里等待。*/
		client = ::accept(s, (SOCKADDR*)&remoteAddr, &nAddrLen);
		if(client == INVALID_SOCKET)
		{
			printf("error");
			continue;
		}

		printf("接受到一个连接:%s\r\n",inet_ntoa(remoteAddr.sin_addr));

		::send(client, szText, strlen(szText), 0); //发送数据

		::closesocket(client);//关闭套接字
	}

	::closesocket(s);
	::WSACleanup();
	return 0;
}



/**************************************************
文件名client.cpp
windows下socket网络编程实例  -- 客户端基于TCP
服务器地址:'127.0.0.1'
端口号 8888
作者:peter
***************************************************/
#include<WinSock2.h>
#include<stdio.h>
#pragma comment(lib, "WS2_32.lib")

int main(int argc, char* argv[])
{
	WSADATA wsaData;
	WORD sockVersion = MAKEWORD(2,0);//指定版本号
	::WSAStartup(sockVersion, &wsaData);//载入winsock的dll
	//建立socket,基于tcp
	SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(s == INVALID_SOCKET)
	{
		printf("error");
		::WSACleanup(); //释放资源
		return 0;
	}

	sockaddr_in servAddr;
	servAddr.sin_family = AF_INET;
	servAddr.sin_port = htons(8888);//端口号

	servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//IP
	//连接
	if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1)
	{
		printf("error");
		::WSACleanup(); //释放资源
		return 0;
	}

	char buff[156];//缓冲区
	int nRecv = ::recv(s, buff, 156, 0);//接收数据
	if(nRecv > 0)
	{
		buff[nRecv] = '\0';
		printf("接受数据:%s",buff);
	}
	::closesocket(s); //关闭套接字
	::WSACleanup(); //释放资源
	return 0;
}



好了下面是基于UDP的服务器和客户端:

/**************************************************
文件名udpserver.cpp
windows下socket网络编程实例  -- 服务器端基于UDP
服务器地址:'127.0.0.1'
端口号 8888
作者:peter
***************************************************/
#include<iostream>
#include<WinSock2.h>
using namespace std;
#pragma comment(lib,"WS2_32.lib")

void main(void)
{
	WSADATA data;
	WORD w = MAKEWORD(2,0);//版本号
	::WSAStartup(w, &data);//载入winsock的dll

	SOCKET sock;
	//创建socket,基于UDP
	sock = ::socket(AF_INET, SOCK_DGRAM, 0);

	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8888);//端口号8888
	addr.sin_addr.S_un.S_addr = INADDR_ANY;//全置为0,表示都可以
	//绑定socket
	if(::bind(sock, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR)
	{
		cout << "服务器启动成功~" << endl;
	}
	else
	{
		//清理工作
		::closesocket(sock);
		::WSACleanup();
		return ;
	}
	char text[10] = {0};
	char stext[] = "Welcome!";
	sockaddr_in addrs;
	int n = sizeof(addrs);
	while(true)
	{
		//发送数据
		if(::recvfrom(sock, text, 10, 0, (sockaddr*)&addrs, &n) != 0)
		{
			cout << inet_ntoa(addrs.sin_addr) << "已经连接上" << endl;
			cout << text << endl;
			//接受数据
			::sendto(sock, stext, sizeof(stext), 0, (sockaddr*)&addrs, n);
			break;
		}
	}
	::closesocket(sock);
	::WSACleanup();
}

/**************************************************
文件名udpclient.cpp
windows下socket网络编程实例  -- 客户端基于UDP
服务器地址:'127.0.0.1'
端口号 8888
作者:peter
***************************************************/
#include<winsock2.h>
#include<iostream>
using namespace std;
#pragma comment(lib,"WS2_32.lib")

void main(void)
{
	WSADATA data;
	WORD w = MAKEWORD(2,0);//版本号
	::WSAStartup(w, &data);//载入winsock的dll

	SOCKET sock;
	//建立socket,基于UDP
	sock = ::socket(AF_INET, SOCK_DGRAM, 0);

	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8888);//端口号
	addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//ip地址
	//绑定socket
	if(::bind(sock, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR)
	{
		cout << "客户端开启成功~" << endl;
	}
	else
	{
		//清理工作
		::closesocket(sock);
		::WSACleanup();
		return ;
	}

	sockaddr_in addrs;
	char text[10] = {0};
	char stext[] = "ssss!";
	int n = sizeof(addrs);
	//发送数据
	if(::sendto(sock, stext, sizeof(stext), 0, (sockaddr*)&addr, sizeof(addr)) != 0)
	{
		//接受数据
		::recvfrom(sock, text, 10, 0, (sockaddr*)&addrs, &n);
		cout << "服务器说: " << text << endl;
		::closesocket(sock);
		::WSACleanup();
	}
}


代码在VS2010下编译通过;

2012/8/15

jofranks  于南昌

原文地址:https://www.cnblogs.com/java20130723/p/3211412.html