• 重温网络编程(一)


    前言

    近日突然发现自己忘记了网络编程,重新拾起一下。
    几个概念性东西:

    很多时候介绍socket连接通讯的时候,往往是上面这张图。
    右边是服务器,左边是客户端。
    服务器:
    第一步: socket(), 是创建一个socket。这个过程我们使用的语言和操作系统?其实就是和我们调用http请求登录是一样的,会返回一个标识符,操作系统是服务端,我们的程序是客户端。
    操作系统内部就做某些东西,可能是创建一个socket,然后返回一个标识码,通过这个标识码,后面调用其他的api,通过传输这个标识符,就可以操作改socket。
    第二步:bind(),去绑定ip和port,因为只有通过ip和port才能找到服务器。
    第三步: listen(),去监听,这个时候才开始了action。判断是否是这个地址,和端口,就可以创建连接。
    第四步:accept(),比如有一个连接来了,操作系统首先帮助我们缓存起来,因为它不知道把这个连接的信息调用给谁,通过accept建立与操作系统的持久性连接,然后操作系统才能源源不断的把连接信息给到我们。
    第五步或者第六步:如果没有accept我们的程序是无法收到消息的,但是我们的操作系统肯定是收到了的,毕竟建立了连接。而我们发现接受信息的时候,我们调用的是
    recv(hSocket,message,sizeof(message)-1,0),我们和操作系统沟通接收信息,实际上是操作系统是通过我们提供的socket。

    客户端:
    客户端就比较简单。
    第一步: 同样是创建一个socket,然后返回给我们一个int 对象,也就是标识符。
    第二步:然后只要给定地址,端口就可以连接,就是connect。
    第三步或者说第四步:和客户端一致,在处理信息上没有客户端和服务端这个概念,只是维护同一套socket机制。

    code

    自己理解的宏观过程,自我理解存在误差:

    以下来自windows,c语言:
    服务端:

    #include <stdio.h>
    #include <stdlib.h>
    #include <WinSock2.h>
    #pragma comment(lib, "ws2_32.lib")
    void ErrorHandling(char *message);
    
    int main(int argc, char * argv[])
    {
    	WSADATA wsaData;
    	SOCKET hServerSock, hClientSock;
    	SOCKADDR_IN serverAddr, clientAddr;
    
    	int szclientAddr;
    	char message[] = "Hello World";
    	if (argc != 2)
    	{
    		printf("Usage :%<port>
    ",argv[0]);
    		exit(1);
    	}
    	if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
    	{
    		ErrorHandling("WASAtartup() error!");
    	}
    	hServerSock = socket(PF_INET,SOCK_STREAM,0);
    	if (hServerSock==INVALID_SOCKET)
    	{
    		ErrorHandling("socket() error");
    	}
    	memset(&serverAddr,0,sizeof(serverAddr));
    	serverAddr.sin_family = AF_INET;
    	serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    	serverAddr.sin_port = htons(atoi(argv[1]));
    
    	if (bind(hServerSock,(SOCKADDR *) &serverAddr,sizeof(serverAddr))==SOCKET_ERROR)
    	{
    		ErrorHandling("bind() error");
    	}
    
    	if (listen(hServerSock,5)==SOCKET_ERROR)
    	{
    		ErrorHandling("listen() Error");
    	}
    
    	szclientAddr = sizeof(clientAddr);
    	hClientSock = accept(hServerSock,(SOCKADDR *) &serverAddr,&szclientAddr);
    	if (hClientSock ==INVALID_SOCKET)
    	{
    		ErrorHandling("accept error");
    	}
    	send(hClientSock,message,sizeof(message),0);
    	closesocket(hClientSock);
    	closesocket(hServerSock);
    	WSACleanup();
    	return 0;
    }
    
    void ErrorHandling(char *message)
    {
    	fputs(message,stderr);
    	fputs('
    ',stderr);
    	exit(1);
    }
    

    客户端:

    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
    void ErrorHandling(char* message);
    
    int main(int argc,char* argv[]) {
    	WSADATA wsaData;
    	SOCKET hSocket;
    	SOCKADDR_IN servAddr;
    	char message[30];
    	int strLen;
    	if (argc!=3)
    	{
    		printf("Usage : %s <IP> <port>
    ",argv[0]);
    		exit(1);
    	}
    	if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
    	{
    		ErrorHandling("WSAStartup() error!");
    	}
    	hSocket = socket(PF_INET,SOCK_STREAM,0);
    	if (hSocket==INVALID_SOCKET)
    	{
    		ErrorHandling("socket() error");
    	}
    	memset(&servAddr,0,sizeof(servAddr));
    	servAddr.sin_family = AF_INET;
    	servAddr.sin_addr.s_addr = inet_addr(argv[1]);
    	servAddr.sin_port = htons(atoi(argv[2]));
    	if (connect(hSocket,(SOCKADDR*) &servAddr,sizeof(servAddr))==SOCKET_ERROR)
    	{
    		ErrorHandling("connect() error!");
    	}
    	strLen = recv(hSocket,message,sizeof(message)-1,0);
    	if (strLen==-1)
    	{
    		ErrorHandling("read() error!");
    	}
    	printf("Message from server:%s 
    ",message);
    	closesocket(hSocket);
    	WSACleanup();
    	return 0;
    }
    void ErrorHandling(char* message) {
    	fputs(message,stderr);
    	fputc('
    ',stderr);
    	exit(1);
    }
    
  • 相关阅读:
    多线程之同步代码块与同步函数
    图片上传客户端与服务端
    tcp上传学习二--文本文件上传
    javaScript编写9*9口诀
    tcp聊天
    udp聊天室--简易
    往sencha.cmd中恢复设计项时,不论是系统的还是应用的,恢复进去之后都应该一键发布到前端
    一个设计项上的按钮调另一个设计项的列表界面,同时加筛选条件
    点击【****】设计项上的某个按钮,直接调出另一个设计项的【编辑界面】
    前端向后端发送请求,后端返回的一个值的请求的ajax.get();方法
  • 原文地址:https://www.cnblogs.com/aoximin/p/12235333.html
Copyright © 2020-2023  润新知