• 【网络编程】之四、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  于南昌

  • 相关阅读:
    mongoDB使用
    mac环境下mongodb的安装和使用
    statrc部分
    权限部分
    在Linux 安装Python3.5.6详细文档!!!!
    linux回顾
    linux服务配置
    路飞ORM练习
    考试题-路飞中期(卷一)
    git hub命令,上传到github
  • 原文地址:https://www.cnblogs.com/java20130723/p/3211412.html
Copyright © 2020-2023  润新知