重温网络编程(一)

前言

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

很多时候介绍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>\n",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('\n',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>\n",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 \n",message);
	closesocket(hSocket);
	WSACleanup();
	return 0;
}
void ErrorHandling(char* message) {
	fputs(message,stderr);
	fputc('\n',stderr);
	exit(1);
}
posted @ 2020-01-27 01:40  敖毛毛  阅读(268)  评论(0编辑  收藏  举报